package itn.let.mjo.pay.web;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.Charset;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import com.ibm.icu.text.DecimalFormat;

import egovframework.rte.fdl.idgnr.EgovIdGnrService;
import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
import itn.com.cmm.ComDefaultCodeVO;
import itn.com.cmm.EgovMessageSource;
import itn.com.cmm.LoginVO;
import itn.com.cmm.service.EgovCmmUseService;
import itn.com.cmm.service.FileVO;
import itn.com.cmm.util.RedirectUrlMaker;
import itn.com.cmm.util.StringUtil;
import itn.com.utl.fcc.service.EgovStringUtil;
import itn.let.mjo.mjocommon.MjonCommon;
import itn.let.mjo.msg.service.MjonMsgService;
import itn.let.mjo.msg.service.MjonMsgVO;
import itn.let.mjo.msgcampain.service.MjonCandidateService;
import itn.let.mjo.msgcampain.service.MjonCandidateVO;
import itn.let.mjo.msgdata.service.MjonMsgDataService;
import itn.let.mjo.pay.service.KmcVO;
import itn.let.mjo.pay.service.MjonPayService;
import itn.let.mjo.pay.service.MjonPayVO;
import itn.let.mjo.pay.service.MjonVaMsgLogVO;
import itn.let.mjo.pay.service.RefundService;
import itn.let.mjo.pay.service.RefundVO;
import itn.let.mjo.pay.service.StVcVO;
import itn.let.mjo.payva.service.VacsVactService;
import itn.let.mjo.payva.service.VacsVactVO;
import itn.let.mjo.reservmsg.service.MjonReservMsgService;
import itn.let.mjo.tax.service.TaxService;
import itn.let.mjo.tax.service.TaxVO;
import itn.let.schdlr.service.SchdlrManageService;
import itn.let.sym.grd.service.MberGrdService;
import itn.let.sym.grd.service.MberGrdVO;
import itn.let.sym.site.service.EgovSiteManagerService;
import itn.let.sym.site.service.JoinSettingVO;
import itn.let.uat.uia.service.AuthCertVO;
import itn.let.uss.umt.service.EgovMberManageService;
import itn.let.uss.umt.service.EgovUserManageService;
import itn.let.uss.umt.service.MberManageVO;
import itn.let.uss.umt.service.UserManageVO;
import itn.let.utl.fcc.service.EgovCryptoUtil;
import itn.let.utl.user.service.MjonNoticeSendUtil;

@Controller
public class MjonPayController {
	
	private static final Logger LOGGER = LoggerFactory.getLogger(MjonPayController.class);
	
	@Resource(name = "mjonPayService")
    private MjonPayService mjonPayService;
	
	/** EgovMessageSource */
    @Resource(name="egovMessageSource")
    EgovMessageSource egovMessageSource;
    
    /** userManageService */
	@Resource(name = "userManageService")
	private EgovUserManageService userManageService;
	
	/** refundService */
	@Resource(name = "refundService")
    private RefundService refundService;
	
	@Resource(name = "mjonMsgService")
    private MjonMsgService mjonMsgService;
	
	@Resource(name = "MjonMsgDataService")
    private MjonMsgDataService mjonMsgDataService;
	
	@Resource(name = "mberManageService")
	private EgovMberManageService mberManageService;
	
	@Resource(name = "EgovCmmUseService")
	private EgovCmmUseService cmmUseService;	
	
	@Resource(name = "egovCryptoUtil")
	EgovCryptoUtil egovCryptoUtil;
	
	@Resource(name = "mjonCandidateService")
    private MjonCandidateService mjonCandidateService;
	
	//전용계좌 서비스
	@Resource(name = "vacsVactService")
	private VacsVactService vacsVactService;
	
	@Resource(name = "MjonReservMsgService")
    private MjonReservMsgService mjonReservMsgService;
	
	@Resource(name="taxService")
    private TaxService taxService;
	
	@Resource(name = "egovPgMoidGnrService")
    private EgovIdGnrService idgenPgMoid;
	
	/** 알림전송 Util */
	@Resource(name = "mjonNoticeSendUtil")
	private MjonNoticeSendUtil mjonNoticeSendUtil;
	
	@Resource(name="MjonCommon")
	private MjonCommon mjonCommon;
	
	@Resource(name = "SchdlrManageService")
    private SchdlrManageService schdlrManageService;
	
	/** 사이트 설정 */ 
	@Resource(name = "egovSiteManagerService")
	EgovSiteManagerService egovSiteManagerService;	
	
	@Resource(name = "mberGrdService")
	MberGrdService mberGrdService;	
	
	//배열 정의{"컬럼순차번호, 컬럼이름, 컬럼내용, 컬럼이름에 붙여야할 내용(엑셀코드양식다운로드시 필요)"}
	private String[][] sendPayExcelValue ={
	    {"0" ,"번호" , "1" , "" },
	    {"1", "결제일시" , "2021-06-08 11:05:38" , ""}, 
	    {"2", "결제방식" , "개인전용계좌", ""}, 
	    {"3", "결제금액" , "500", ""}, 
	    {"4", "결제상태" , "결제완료", ""},
	    {"5", "결제정보" , "승인번호 : nicepay00m03012105271819041065", ""},
	    {"6", "증빙서류 발행요청" , "카드전표", ""}
	} ;
	
	private String[][] sendPayExcelValue2 ={
		    {"0" ,"번호" , "1" , "" },
		    {"1", "결제일자" , "2021-06-08 11:05:38" , ""},
		    {"2", "결제시간" , "2021-06-08 11:05:38" , ""},
		    {"3", "결제수단" , "개인전용계좌", ""}, 
		    {"4", "결제상태" , "결제완료", ""},
		    {"5", "결제금액" , "500", ""} 
		} ;	
	
	//배열 정의{"컬럼순차번호, 컬럼이름, 컬럼내용, 컬럼이름에 붙여야할 내용(엑셀코드양식다운로드시 필요)"}
	private String[][] sendPayUserExcelValue ={
	    {"0" ,"번호" , "1" , "" },
	    {"1", "결제일시" , "2021-06-08 11:05:38" , ""}, 
	    {"2", "문자유형" , "단문", ""}, 
	    {"3", "발송건수" , "1", ""},
	    {"4", "문자내용" , "문자내용", ""}, 
	    {"5", "충전금액" , "100", ""},
	    {"6", "충전포인트" , "100", ""},
	    {"7", "사용금액" , "100", ""},
	    {"8", "사용포인트" , "100", ""},
	    {"9", "잔액금액" , "100", ""},
	    {"10", "잔액포인트" , "100", ""},
	} ;
	
	private String[][] sendPointUseExcelValue ={
	    {"0" ,"번호" , "1" , "" },
	    {"1", "교환일시" , "2021-06-08 11:05:38" , ""}, 
	    {"2", "교환방식" , "현금", ""}, 
	    {"3", "교환포인트" , "10000", ""},
	    {"4", "교환상태" , "처리완료", ""},
	    {"5", "은행" , "우리은행", ""},
	    {"6", "계좌번호" , "10112314124", ""},
	    {"7", "예금주" , "홍길동", ""},
	    {"8", "연락처" , "01012341234", ""},
	} ;
	
	
	private String[][] refundExcelValue ={
	    {"0" ,"번호" , "1" , "" },
	    {"1", "환불요청일시" , "2021-06-08 11:05:38" , ""}, 
	    {"2", "환불처리일시(취소/불가처리 포함)" , "2021-06-08 11:05:38", ""}, 
	    {"3", "환불요청금액" , "10000", ""},
	    {"4", "환불처리금액" , "10000", ""}, 
	    {"5", "환불처리상태" , "처리완료", ""},
	} ;
		
	 /**
     * 캐시 리스트
     * @param searchVO
     * @param model
     * @return	"/uss/ion/msg/SendNumberList"
     * @throws Exception
     */
    @RequestMapping(value= {"/uss/ion/pay/CashList.do"})
	public String selectCashList(@ModelAttribute("searchVO") MjonPayVO mjonPayVO, 
			HttpServletRequest request,
			ModelMap model) throws Exception{
    	
    	String pattern = (String) request.getAttribute(
                HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE) ;
    	
		/** pageing */
		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(mjonPayVO.getPageIndex());
		paginationInfo.setRecordCountPerPage(mjonPayVO.getPageUnit());
		paginationInfo.setPageSize(mjonPayVO.getPageSize());
		
		mjonPayVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
		mjonPayVO.setLastIndex(paginationInfo.getLastRecordIndex());
		mjonPayVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
		
		if("".equals(mjonPayVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
			mjonPayVO.setSearchSortCnd("cashId");
			mjonPayVO.setSearchSortOrd("desc");
		}
		
		if(null == mjonPayVO.getSearchCondition2()) { //최초조회시 (미삭제 만 보이게)
			mjonPayVO.setSearchCondition2("N");
		}
		
        List<MjonPayVO> resultList = mjonPayService.selectCashList(mjonPayVO);
        
        List<BigDecimal> cashList = new ArrayList<>();
        for(int i = 0 ; i < resultList.size() ; i ++) {
    	   BigDecimal cash = new BigDecimal(resultList.get(i).getCash()).setScale(2, RoundingMode.HALF_EVEN);
    	   cashList.add(cash);
       }
        
        model.addAttribute("cashList", cashList);
        model.addAttribute("resultList", resultList);
        paginationInfo.setTotalRecordCount(resultList.size() > 0 ? ((MjonPayVO)resultList.get(0)).getTotCnt() : 0);
		model.addAttribute("paginationInfo", paginationInfo);
		
		if(pattern.equals("/web/msg/SendNumberList.do")) { //사용자 발신
			return "/web/msg/SendNumberList";
		}
		return "/uss/ion/pay/CashList";
	}
    
	 /**
     * 캐시 리스트
     * @param searchVO
     * @param model
     * @return	"/uss/ion/msg/SendNumberList"
     * @throws Exception
     */
    @RequestMapping(value= {"/uss/ion/pay/CashRemainList.do"})
	public String selectCashRemainList(@ModelAttribute("searchVO") MjonPayVO mjonPayVO, 
			HttpServletRequest request,
			ModelMap model) throws Exception{
    	
    	String pattern = (String) request.getAttribute(
                HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE) ;
    	
		/** pageing */
		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(mjonPayVO.getPageIndex());
		paginationInfo.setRecordCountPerPage(mjonPayVO.getPageUnit());
		paginationInfo.setPageSize(mjonPayVO.getPageSize());
		
		mjonPayVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
		mjonPayVO.setLastIndex(paginationInfo.getLastRecordIndex());
		mjonPayVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
		
		if("".equals(mjonPayVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
			mjonPayVO.setSearchSortCnd("remainCash");
			mjonPayVO.setSearchSortOrd("desc");
		}
		
        List<MjonPayVO> resultList = mjonPayService.selectCashRemainNewList(mjonPayVO);
        
        int totCnt = mjonPayService.selectCashRemainNewCnt(mjonPayVO);
        
        model.addAttribute("resultList", resultList);
        paginationInfo.setTotalRecordCount(totCnt);
		model.addAttribute("paginationInfo", paginationInfo);
		
		return "/uss/ion/pay/CashRemainList";
	}
    
    /**
     * 캐시  등록/수정
     * @param searchVO
     * @param model
     * @return	"/uss/ion/pay/CashModify.do"
     * @throws Exception
     */
    @RequestMapping(value = {"/uss/ion/pay/CashModify.do"})
    public String CashModify(
            @ModelAttribute("searchVO") MjonPayVO searchVO, 
            HttpServletRequest request ,
            Model model) throws Exception {
    	
    	String pattern = (String) request.getAttribute(
                HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE) ;
    	
    	MjonPayVO mjonPayVO = new MjonPayVO(); 
    	if(null != searchVO.getCashId() &&  !"".equals(searchVO.getCashId())) { //수정
    		mjonPayVO  = mjonPayService.selectCashVO(searchVO);
    	}
    	BigDecimal cash = new BigDecimal(mjonPayVO.getCash()).setScale(2, RoundingMode.HALF_EVEN);
    	
    	model.addAttribute("cash",cash);
		model.addAttribute("mjonPayVO", mjonPayVO);
		model.addAttribute("searchVO", searchVO);
		return "/uss/ion/pay/CashModify";
    }
    
    /**
     * * 캐시  등록
     * @param searchVO
     * @param model
     * @return	"/uss/ion/pay/CashInsert.do"
     * @throws Exception
     */
    @RequestMapping(value = {"/uss/ion/pay/InsertCash.do"})
    public String insertCash(
            @ModelAttribute("searchVO") MjonPayVO mjonPayVO, 
            HttpServletRequest request , RedirectAttributes redirectAttributes,
            Model model) throws Exception {
    	
    	String pattern = (String) request.getAttribute(
                HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE) ;
    	
    	try {
    		LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
        	String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
        	mjonPayVO.setFrstRegisterId(userId);
        	mjonPayService.insertCash(mjonPayVO);
    	}catch(Exception e) {
    		
    	}
    	redirectAttributes.addFlashAttribute("message", "등록이 완료되었습니다.");
		RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/uss/ion/pay/CashList.do");
		return redirectUrlMaker.getRedirectUrl();
    }
    
    /**
   	 * 관리자 회원정보 팝업 캐쉬 충전 처리
   	 * @param MjonPayVO
   	 * @param modelAndView
   	 * @return uss/umt/user/EgovGnrlselectedUserView.do
   	 * @throws Exception
   	 */
   	@RequestMapping(value = "/uss/ion/pay/InsertUserCashAjax.do")
   	public ModelAndView InsertUserCashAjax(MjonPayVO mjonPayVO, 
            HttpServletRequest request ) throws Exception {

       	ModelAndView modelAndView = new ModelAndView();
       	modelAndView.setViewName("jsonView");

   		LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
   		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());

   		if(userId == null) {
   			modelAndView.addObject("result", "loginFail");
        	modelAndView.addObject("message", "로그인이 필요합니다.");
   		}
   		
   		try {
   			
        	mjonPayVO.setFrstRegisterId(userId); //관리자 로그인 아이디 셋팅
        	
        	double cash = mjonPayVO.getCash();			// 충전 금액 정보
        	double minusCash = mjonPayVO.getMinusCash();	// 차감 금액 정보
        	
        	if(cash == 0) {//충전 금액이 없고 차감 금액 정보가 있으면 캐시 정보 변경 처리 
        		 
        		cash = -Math.abs(minusCash);//넘어오는 차감 캐시 정보에 - 가 들어있을까봐 절대값으로 변경 후 음수 처리해줌
        		mjonPayVO.setCash(cash);
        		
        	}
        	
        	mjonPayService.insertCash(mjonPayVO);
        	
        	modelAndView.addObject("result", "success");
        	modelAndView.addObject("message", "캐쉬 충전이 완료 되었습니다.");
        	
    	}catch(Exception e) {
    		
    		System.out.println("회원정보 팝업 캐쉬 충전 오류 발생");
    		modelAndView.addObject("result", "fail");
        	modelAndView.addObject("message", "캐쉬 충전에 오류가 발생하였습니다.");
        	
    	}

   		return modelAndView;
   	}
   	
    /**
   	 * 관리자 회원정보 팝업 포인트 충전 처리
   	 * @param MjonPayVO
   	 * @param modelAndView
   	 * @return uss/umt/user/EgovGnrlselectedUserView.do
   	 * @throws Exception
   	 */
   	@RequestMapping(value = "/uss/ion/pay/InsertUserPointAjax.do")
   	public ModelAndView InsertUserPointAjax(MjonPayVO mjonPayVO, 
            HttpServletRequest request ) throws Exception {

       	ModelAndView modelAndView = new ModelAndView();
       	modelAndView.setViewName("jsonView");

   		LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
   		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());

   		if(userId == null) {
   			modelAndView.addObject("result", "loginFail");
        	modelAndView.addObject("message", "로그인이 필요합니다.");
   		}
   		
   		try {
   			
   			System.out.println(userId);
        	mjonPayVO.setFrstRegisterId(userId); //관리자 로그인 아이디 셋팅
        	
        	int point = mjonPayVO.getPoint();			// 충전 포인트 정보
        	int minusPoint = mjonPayVO.getMinusPoint();	// 차감포인트 정보
        	
        	if(point == 0) {//충전포인트가 없고 차감 포인트 정보가 있으면 포인트 정보 변경 처리 
        		
        		point = -Math.abs(minusPoint);//넘어오는 차감 포인트 정보에 - 가 들어있을까봐 절대값으로 변경 후 음수 처리해줌
        		mjonPayVO.setPoint(point);
        		
        	}
        	
        	mjonPayService.insertPoint(mjonPayVO);
        	
        	modelAndView.addObject("result", "success");
        	modelAndView.addObject("message", "포인트 충전이 완료 되었습니다.");
        	
    	}catch(Exception e) {
    		
    		System.out.println("회원정보 팝업 포인트 충전 오류 발생 Controller");
    		modelAndView.addObject("result", "fail");
        	modelAndView.addObject("message", "포인트 충전에 오류가 발생하였습니다.");
        	
    	}

   		return modelAndView;
   	}
    
    
    /**
     * 캐쉬 수정.
     * @param searchVO
     * @param hpcmVO
     * @param bindingResult
     * @return	"forward:/uss/ion/pay/UpdateCash"
     * @throws Exception
     */
    @RequestMapping(value = {"/uss/ion/pay/UpdateCash.do"})
    public String updateCash(
            MjonPayVO mjonPayVO, HttpServletRequest request , 
            RedirectAttributes redirectAttributes
            )
            throws Exception {

    	String pattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE) ;
    	
    	LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
    	String	lastUpdusrId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
    	try {
    		mjonPayVO.setLastUpdusrId(lastUpdusrId);
    		mjonPayService.deleteCash(mjonPayVO);   // 상태만 업데이트
    	}catch(Exception e) {
    		redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.update"));
    	}
    	redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.update"));
		RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/uss/ion/pay/CashList.do");
		return redirectUrlMaker.getRedirectUrl();
    }
    
    /**
     * 캐쉬 삭제 프로세서(del_flag : Y로 업데이트)
     * @param searchVO
     * @param model
     * @return	"/uss/ion/pay/CashDelete.do"
     * @throws Exception
     */
    @RequestMapping(value = {"/uss/ion/pay/CashDelete.do"})
    public String deleteCash(
    		@RequestParam("del") String[] del,
    		@ModelAttribute("searchVO") MjonPayVO mjonPayVO, 
            HttpServletRequest request , RedirectAttributes redirectAttributes,
            Model model) throws Exception {
    	try {
    		LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
        	String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
        	for(String id: del) {
        		mjonPayVO.setCashId(id);
        		mjonPayVO.setDelFlag("Y"); //삭제 Y로 업데이트
        		mjonPayService.deleteCash(mjonPayVO);
     	    }
    		redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.update"));
    		RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/uss/ion/pay/CashList.do");
    		return redirectUrlMaker.getRedirectUrl();
    	}catch(Exception e) {
    		redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.update"));
    	}
    	redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.delete"));
		RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/uss/ion/pay/CashList.do");
		return redirectUrlMaker.getRedirectUrl();
    }
    
    /**
     * 결제 리스트
     * @param searchVO
     * @param model
     * @return	"/uss/ion/msg/SendNumberList"
     * @throws Exception
     */
    @RequestMapping(value= {"/uss/ion/pay/PayList.do"})
	public String selectPayList(@ModelAttribute("searchVO") MjonPayVO mjonPayVO, 
			HttpServletRequest request,
			ModelMap model) throws Exception{
		
		String pattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE) ;

		/** pageing */
		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(mjonPayVO.getPageIndex());
		paginationInfo.setRecordCountPerPage(mjonPayVO.getPageUnit());
		paginationInfo.setPageSize(mjonPayVO.getPageSize());
		
		mjonPayVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
		mjonPayVO.setLastIndex(paginationInfo.getLastRecordIndex());
		mjonPayVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
		
		if("".equals(mjonPayVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
			mjonPayVO.setSearchSortCnd("regDate");
			mjonPayVO.setSearchSortOrd("desc");
		}
		
        List<MjonPayVO> resultList = mjonPayService.selectPayList(mjonPayVO);   
        
        model.addAttribute("resultList", resultList);
        paginationInfo.setTotalRecordCount(resultList.size() > 0 ? ((MjonPayVO)resultList.get(0)).getTotCnt() : 0);
		model.addAttribute("paginationInfo", paginationInfo);
		
		return "/uss/ion/pay/PayList";
	}
    
	
    //관리자 결제 엑셀 다운로드 
    @RequestMapping(value= {"/uss/ion/pay/SendPayExcelDownload.do"})
  	public void SendPayExcelDownload( MjonPayVO mjonPayVO, 
			HttpServletRequest request,
			HttpServletResponse response ,
			ModelMap model) throws Exception {
  		
    	mjonPayVO.setRecordCountPerPage(5000);
    	mjonPayVO.setFirstIndex(0);
  		LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
		
  		// 메모리에 100개의 행을 유지합니다. 행의 수가 넘으면 디스크에 적습니다.
  		SXSSFWorkbook wb = new SXSSFWorkbook(100);
  		CellStyle style = wb.createCellStyle();
  		style.setBorderBottom(CellStyle.BORDER_THIN); //테두리 두껍게 
   		style.setBorderLeft(CellStyle.BORDER_THIN);
   		style.setBorderRight(CellStyle.BORDER_THIN);
   		style.setBorderTop(CellStyle.BORDER_THIN);
   		Font font = wb.createFont();
   		font.setBoldweight(Font.BOLDWEIGHT_BOLD);  //글씨 bold
   		
  		Cell cell = null;
  		Row row = null;
  		
  		String fileName ="결제내역";
  		
  		String sheetTitle = ""; 
  		try{
  			if("".equals(mjonPayVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
  				mjonPayVO.setSearchSortCnd("regDate");
  				mjonPayVO.setSearchSortOrd("desc");
  			}
  			
  	        List<MjonPayVO> resultList = mjonPayService.selectPayList(mjonPayVO); 
  			
  			{ //화면 리스트
  				sheetTitle = "결제내역" ; //제목
  				Sheet sheet = wb.createSheet(sheetTitle);
  				sheet.setColumnWidth(0, 2500);
  				sheet.setColumnWidth(1, 3500);
  				sheet.setColumnWidth(2, 3500);
  				sheet.setColumnWidth(3, 4000);
  				sheet.setColumnWidth(4, 3500);
  				sheet.setColumnWidth(5, 5000);
  				row = sheet.createRow(0);
  		        for(int i=0 ; i < sendPayExcelValue2.length ; i++) {
  	 		       cell = row.createCell(i);
  	 		       cell.setCellStyle(style);
  		 	       cell.setCellValue(sendPayExcelValue2[i][1]);
  	 		    }
  			    
  		        for(int i=0; i <  resultList.size(); i++){
  			    	row = sheet.createRow(i+1);
  			    	for(int j=0 ; j < sendPayExcelValue2.length ; j++) {
  			    		// 번호, 	결제일자, 결제시간, 결제수단, 결제상태, 결제금액
  			        	cell = row.createCell(j);
  			        	cell.setCellStyle(style);
  			        	if(j==0) cell.setCellValue(i+1); //번호
  			        	if(j==1) cell.setCellValue(((MjonPayVO)resultList.get(i)).getRegDate().substring(0,10)); //결제일시
  			        	if(j==2) cell.setCellValue(((MjonPayVO)resultList.get(i)).getRegDate().substring(11,19)); //결제일시
  			        	if(j==3) cell.setCellValue(((MjonPayVO)resultList.get(i)).getPayMethodTxt()); //결제수단
  			        	if(j==4) cell.setCellValue(((MjonPayVO)resultList.get(i)).getPgStatusTxt()); //결제상태
  			        	if(j==5) cell.setCellValue(((MjonPayVO)resultList.get(i)).getAmt()); //결제금액(부과세포함)
  				 	}
  		        }
  		        
  			}
  	    response.setHeader("Set-Cookie", "fileDownload=true; path=/");
  		SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat ( "yyyy_MM_dd_HH_mm_ss", Locale.KOREA );
  		Date currentTime = new Date ();
  		String mTime = mSimpleDateFormat.format ( currentTime );
  		fileName = fileName+"("+mTime+")";
  		
  		response.setHeader("Content-Disposition", String.format("attachment; filename=\""+new String((fileName).getBytes("KSC5601"),"8859_1")+".xlsx"));
  		wb.write(response.getOutputStream());
  	    
  		}catch(Exception e) {
  			response.setHeader("Set-Cookie", "fileDownload=false; path=/");
  			response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
  			response.setHeader("Content-Type","text/html; charset=utf-8");
  			OutputStream out = null;
  			try {
  				out = response.getOutputStream();
  				byte[] data = new String("fail..").getBytes();
  				out.write(data, 0, data.length);
  			} catch(Exception ignore) {
  				ignore.printStackTrace();
  			} finally {
  				if(out != null) try { out.close(); } catch(Exception ignore) {}
  			}
  		}finally {
  			// 디스크 적었던 임시파일을 제거합니다.
  			wb.dispose();
  			try { wb.close(); } catch(Exception ignore) {}
  		}
  	}

  	
	/**
     * 결제 리스트 스미싱 on off 처리
     * @param searchVO
     * @param model
     * @return	"/uss/ion/pay/PayUsersSmishingUpdate.do"
     * @throws Exception
     */	
	@RequestMapping("/uss/ion/pay/PayUsersSmishingUpdate.do")
	public String PayUsersSmishingUpdate(@RequestParam("checkedIdForDel") String checkedIdForUpt, @ModelAttribute("userManageVO") UserManageVO userManageVO, RedirectAttributes redirectAttributes, Model model) throws Exception {
		
		// 미인증 사용자에 대한 보안처리
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		if(!isAuthenticated) {
			model.addAttribute("message", egovMessageSource.getMessage("fail.common.login"));
			return "uat/uia/EgovLoginUsr";
		}
		
		userManageService.updateUserSmishingYn(userManageVO, checkedIdForUpt);
		
		
		redirectAttributes.addFlashAttribute("message", "스미싱의심 여부가 정상적으로 수정되었습니다.");
		RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/uss/ion/pay/PayList.do?pageIndex="+userManageVO.getPageIndex());
		return redirectUrlMaker.getRedirectUrl();
	}	    
    /**
	 * 후불제 고객 입금확인 후 결제완료로 수정하기 위한 팝업
	 * @param mjonPayVO
	 * @param request
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/uss/ion/pay/PgStatusPop.do")
	public String selectedUserView(@ModelAttribute MjonPayVO mjonPayVO,
			HttpServletRequest request, 
			Model model) throws Exception {
		
		model.addAttribute("mjonPayVO",mjonPayVO);
		return "/uss/ion/pay/PgStatusPop";
	}	
    
	
	/**
	 * 후불제 고객 입금확인 후 결제완료로 수정하기 위한 팝업
	 * @param mjonPayVO
	 * @param request
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/uss/ion/pay/updatePgStatusAfterPayAjax.do")
	public ModelAndView updatePgStatusAfterPayAjax(@ModelAttribute("searchVO") MjonPayVO mjonPayVO, 
			ModelMap model) throws Exception{
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		
		boolean isSuccess = true;
		int updtCnt = 0;
		String msg = "결제완료 처리되었습니다.";
		
		try {
			
			LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
			String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
			
			if(userId.equals("")) {
				isSuccess = false;
				modelAndView.addObject("isSuccess", isSuccess);
				modelAndView.addObject("msg", "로그인 후 이용이 가능합니다.");
				return modelAndView;
			}
			
			// 후불 결제완료 + 포인트 추가
			mjonPayService.updateMjonPgStatusAfterPayPointSave(mjonPayVO);
		}
		catch(Exception e) {
			isSuccess = false;
			msg = "오류 : " + e.getMessage();
		}
		
		modelAndView.addObject("isSuccess", isSuccess);        		
		modelAndView.addObject("msg", msg);

		return modelAndView;
	}    
		
    /**
     * 결제 등록/수정
     * @param searchVO
     * @param model
     * @return	"/uss/ion/pay/CashModify.do"
     * @throws Exception
     */
    @RequestMapping(value = {"/uss/ion/pay/PayModify.do"})
    public String PayModify(
            @ModelAttribute("searchVO") MjonPayVO searchVO, 
            HttpServletRequest request ,
            Model model) throws Exception {
    	
    	String pattern = (String) request.getAttribute(
                HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE) ;
    	try {
	    	MjonPayVO mjonPayVO = new MjonPayVO(); 
	    	if(null != searchVO.getMoid() &&  !"".equals(searchVO.getMoid())) { //수정
	    		mjonPayVO  = mjonPayService.selectPayVO(searchVO);
	    	}
	    	String referer = (String)request.getHeader("REFERER");
	    	model.addAttribute("pointPage", referer.contains("PointList"));  //포인트페이지에서 온것 true
	    	model.addAttribute("cashPage", referer.contains("CashList"));  //캐시페이지에서 온것 true
			model.addAttribute("mjonPayVO", mjonPayVO);
			model.addAttribute("searchVO", searchVO);
    	}
    	catch(Exception e) {
    		System.out.println("searchVO.getMoid() : " + searchVO.getMoid());
    		System.out.println("PayModify Error : " + e.getMessage());
    	}
    	
		return "/uss/ion/pay/PayModify";
    }
    
    
    /**
	 * 나이스페이(PG사 전송화면)
	 *
	 * @param 
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/web/cop/nicepay/payRequestAjax.do")
	public String payRequest(HttpServletRequest request, 
			ModelMap model , @RequestParam Map<String, Object> commandMap, 
			@ModelAttribute("searchVO") MjonPayVO mjonPayVO) throws Exception {
		
		mjonPayVO.setReturnURL(request.getRequestURL().toString().split("nice")[0] + "nicepay/payResultAjax.do") ;
		
		//테스트
		if(null ==  mjonPayVO.getPrice()) {
			mjonPayVO.setPrice("500");
		}
		if(null ==  mjonPayVO.getBuyerName()) {
			mjonPayVO.setBuyerName("우영두");
		}
		if(null ==  mjonPayVO.getBuyerTel()) {
			mjonPayVO.setBuyerTel("01063170383");
		}
		if(null ==  mjonPayVO.getBuyerEmail()) {
			mjonPayVO.setBuyerEmail("rosehips@naver.com");
		}
		if(null ==  mjonPayVO.getMoid()) {
			mjonPayVO.setMoid("mnoid1234567890");
		}
		model.addAttribute("mjonPayVO", mjonPayVO);
		//return "web/cop/nicepay/payRequest";
		return "web/cop/nicepay/payRequestAjax";
	}
	
	
	/**
	 * 나이스페이(PG사 결과 리턴  페이지)
	 *
	 * @param 
	 * @return
	 * @throws Exception
	 */
	@RequestMapping( value = {"/web/cop/nicepay/payResultAjax.do" , "/web/member/pay/payResultAjax.do"}) 
	public String payResult(HttpServletRequest request, 
			ModelMap model , @RequestParam Map<String, Object> commandMap, 
			@ModelAttribute("searchVO") MjonPayVO mjonPayVO) throws Exception {
		
		
		String pattern = (String) request.getAttribute(
                HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE) ;
		
		//mjonPayVO.setReturnURL(request.getRequestURL().toString().split("nice")[0] + "payResult.do") ;
		MjonPayVO returnMjonPayVO = new MjonPayVO();
		
		returnMjonPayVO = mjonPayService.insertPay(mjonPayVO , request, "nice" ); //PG, PGTXT, CASH , 포인트 insert / 회원정보 캐시,포인트 update
		
		model.addAttribute("mjonPayVO", returnMjonPayVO);
		if(pattern.equals("/web/member/pay/payResultAjax.do")){
			model.addAttribute("userPage", true);
		}
		
		return "web/cop/nicepay/payResultAjax";
	}
	
	/**
	 * 나이스페이(PG사 결제취소화면)
	 *
	 * @param 
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/web/cop/nicepay/cancelRequestAjax.do")
	public String cancelRequestAjax(HttpServletRequest request, 
			ModelMap model , @RequestParam Map<String, Object> commandMap, 
			@ModelAttribute("searchVO") MjonPayVO mjonPayVO) throws Exception {
		
		mjonPayVO.setReturnURL(request.getRequestURL().toString().split("nice")[0] + "nicepay/payResultAjax.do") ;
		
		//테스트
		if(null ==  mjonPayVO.getPrice()) {
			mjonPayVO.setPrice("500");
		}
		if(null ==  mjonPayVO.getBuyerName()) {
			mjonPayVO.setBuyerName("우영두");
		}
		if(null ==  mjonPayVO.getBuyerTel()) {
			mjonPayVO.setBuyerTel("01063170383");
		}
		if(null ==  mjonPayVO.getBuyerEmail()) {
			mjonPayVO.setBuyerEmail("rosehips@naver.com");
		}
		if(null ==  mjonPayVO.getMoid()) {
			mjonPayVO.setMoid("mnoid1234567890");
		}

		model.addAttribute("mjonPayVO", mjonPayVO);
		//return "web/cop/nicepay/payRequest";
		return "web/cop/nicepay/cancelRequestAjax";
	}
	
	
	/**
	 * 나이스페이(PG사 결제취소 결과)
	 *
	 * @param 
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/web/cop/nicepay/cancelResultAjax.do")
	public String cancelResultAjax(HttpServletRequest request, 
			ModelMap model , @RequestParam Map<String, Object> commandMap, 
			@ModelAttribute("searchVO") MjonPayVO mjonPayVO) throws Exception {
		
		
		MjonPayVO returnMjonPayVO = new MjonPayVO();
		returnMjonPayVO = mjonPayService.cancelPay(mjonPayVO , request ); //PG, CASH , 포인트 insert / 회원정보 캐시,포인트 update
		model.addAttribute("mjonPayVO", returnMjonPayVO);
		return "web/cop/nicepay/cancelResultAjax";
	}
	
	 /**
		 * 나이스페이(PG사 전송화면)
		 *
		 * @param 
		 * @return
		 * @throws Exception
		 */
		@RequestMapping("/web/cop/kmc/authRequestAjax.do")
		public String authRequestAjax(HttpServletRequest request, HttpSession session, HttpServletResponse response,
				ModelMap model , @RequestParam Map<String, Object> commandMap, 
				@ModelAttribute("searchVO") KmcVO kmcVO) throws Exception {
			
			//크롬 SameSite정책 방지 - 도메인이 다른 타사로 이동 시 크롬 정책에 의해 세션 유실이 일어나는 경우가 있는데, 이를 방지하기 위해 samesite 보안을 none처리
			response.setHeader("Set-Cookie", "mberSession=mberSession; Secure; SameSite=None");
			
			System.out.println("++++++++++++ 세션체크 ::: "+ session.getAttribute("mberSession"));
			
			String errMessage = ""; //에러메세지
			
			String rec_cert      = "";  // 결과값(암호화)
			String certNum       = "";  // certNum
			
		    rec_cert = request.getParameter("rec_cert").trim();
			certNum  = request.getParameter("certNum").trim(); 
			
			kmcVO.setRecCert(rec_cert);
			kmcVO.setCertNum(certNum);
			// 파라미터 유효성 검증
			if( rec_cert.length() == 0 || certNum.length() == 0 ){
				errMessage = "비정상";
				return returnPage(model , errMessage , kmcVO) ;
			}
			
			
			// 변수선언 --------------------------------------------------------------------------------------------------------
			String k_certNum = "";			    // 파라미터로 수신한 요청번호
			k_certNum = certNum;
		    String date			= "";			// 요청일시
			String CI	    	= "";			// 연계정보(CI)
			String DI	    	= "";			// 중복가입확인정보(DI)
		    String phoneNo		= "";			// 휴대폰번호
			String phoneCorp	= "";			// 이동통신사
			String birthDay		= "";			// 생년월일
			String gender		= "";			// 성별
			String nation		= "";			// 내국인
			String name			= "";			// 성명
			String M_name		= "";			// 미성년자 성명
			String M_birthDay	= "";			// 미성년자 생년월일
			String M_Gender		= "";			// 미성년자 성별
			String M_nation		= "";			// 미성년자 내외국인
		    String result		= "";			// 결과값

		    String certMet		= "";			// 인증방법
		    String ip			= "";			// ip주소
			String plusInfo		= "";

			String encPara		= "";
			String encMsg1		= ""; 
			String encMsg2		= "";
			String msgChk       = "";
			
			com.icert.comm.secu.IcertSecuManager seed = new com.icert.comm.secu.IcertSecuManager();
			 
			//02. 1차 복호화
	        //수신된 certNum를 이용하여 복호화
	        rec_cert  = seed.getDec(rec_cert, k_certNum);

	        //03. 1차 파싱
	        int inf1 = rec_cert.indexOf("/",0);
	        int inf2 = rec_cert.indexOf("/",inf1+1);

			encPara  = rec_cert.substring(0,inf1);         //암호화된 통합 파라미터
	        encMsg1  = rec_cert.substring(inf1+1,inf2);    //암호화된 통합 파라미터의 Hash값

			//04. 위변조 검증
			encMsg2  = seed.getMsg(encPara);
			kmcVO.setEncMsg2(encMsg2);
	        if(encMsg2.equals(encMsg1)){
	            msgChk="Y";
	        }
	        
			if(!"Y".equals(msgChk)) {
				errMessage = "비정상접근입니다.";
				return returnPage(model , errMessage , kmcVO) ;
			}
			
			 //05. 2차 복호화
			rec_cert  = seed.getDec(encPara, k_certNum);
			kmcVO.setRecCert(rec_cert);
	        //06. 2차 파싱
	        int info1  = rec_cert.indexOf("/",0);
	        int info2  = rec_cert.indexOf("/",info1+1);
	        int info3  = rec_cert.indexOf("/",info2+1);
	        int info4  = rec_cert.indexOf("/",info3+1);
	        int info5  = rec_cert.indexOf("/",info4+1);
	        int info6  = rec_cert.indexOf("/",info5+1);
	        int info7  = rec_cert.indexOf("/",info6+1);
	        int info8  = rec_cert.indexOf("/",info7+1);
			int info9  = rec_cert.indexOf("/",info8+1);
			int info10 = rec_cert.indexOf("/",info9+1);
			int info11 = rec_cert.indexOf("/",info10+1);
			int info12 = rec_cert.indexOf("/",info11+1);
			int info13 = rec_cert.indexOf("/",info12+1);
			int info14 = rec_cert.indexOf("/",info13+1);
			int info15 = rec_cert.indexOf("/",info14+1);
			int info16 = rec_cert.indexOf("/",info15+1);
			int info17 = rec_cert.indexOf("/",info16+1);
			int info18 = rec_cert.indexOf("/",info17+1);

	        certNum		= rec_cert.substring(0,info1); kmcVO.setCertNum(certNum);
	        date		= rec_cert.substring(info1+1,info2); kmcVO.setDate(date); 
	        CI			= rec_cert.substring(info2+1,info3); kmcVO.setCI(CI);
	        phoneNo		= rec_cert.substring(info3+1,info4); kmcVO.setPhoneNo(phoneNo);
	        phoneCorp	= rec_cert.substring(info4+1,info5); kmcVO.setPhoneCorp(phoneCorp);
	        birthDay	= rec_cert.substring(info5+1,info6); kmcVO.setBirthDay(birthDay);
	        gender		= rec_cert.substring(info6+1,info7); kmcVO.setGender(gender);
	        nation		= rec_cert.substring(info7+1,info8); kmcVO.setNation(nation);
			name		= rec_cert.substring(info8+1,info9); kmcVO.setName(name);
			result		= rec_cert.substring(info9+1,info10); kmcVO.setResult(result);
			certMet		= rec_cert.substring(info10+1,info11); kmcVO.setCertMet(certMet);
			ip			= rec_cert.substring(info11+1,info12); kmcVO.setIp(ip);
			M_name		= rec_cert.substring(info12+1,info13); kmcVO.setMName(M_name);
			M_birthDay	= rec_cert.substring(info13+1,info14); kmcVO.setMBirthDay(M_birthDay);
			M_Gender	= rec_cert.substring(info14+1,info15); kmcVO.setMGender(M_Gender);
			M_nation	= rec_cert.substring(info15+1,info16); kmcVO.setMNation(M_nation);
			plusInfo	= rec_cert.substring(info16+1,info17); kmcVO.setPlusInfo(plusInfo);
			DI      	= rec_cert.substring(info17+1,info18); kmcVO.setDI(DI);

	        //07. CI, DI 복호화
	        CI  = seed.getDec(CI, k_certNum); kmcVO.setCI(CI);
	        DI  = seed.getDec(DI, k_certNum); kmcVO.setDI(DI);
			
	        if("Y".equals(result)) {
	        	
	        }
	        
	        //--------------------------------------------------------------
	        String regex = "";
	        if( certNum.length() == 0 || certNum.length() > 40){
				errMessage = "요청번호 비정상.";
				return returnPage(model , errMessage , kmcVO) ;
			}

			regex = "[0-9]*";
			if( date.length() != 14 || !paramChk(regex, date) ){
				errMessage = "요청일시";
				return returnPage(model , errMessage , kmcVO) ;
			}

			regex = "[A-Z]*";
			if( certMet.length() != 1 || !paramChk(regex, certMet) ){
				errMessage = "본인인증방법 비정상" + certMet;
				return returnPage(model , errMessage , kmcVO) ;
			}


			regex = "[0-9]*";
			if( (phoneNo.length() != 10 && phoneNo.length() != 11) || !paramChk(regex, phoneNo) ){
				errMessage = "휴대폰번호 비정상" ;
				return returnPage(model , errMessage , kmcVO) ;
			}
			
			regex = "[A-Z]*";
			if( phoneCorp.length() != 3 || !paramChk(regex, phoneCorp) ){
				errMessage = "이동통신사 비정상";
				return returnPage(model , errMessage , kmcVO) ;
			}

			regex = "[0-9]*";
			if( birthDay.length() != 8 || !paramChk(regex, birthDay) ){
				errMessage = "생년월일 비정상";
				return returnPage(model , errMessage , kmcVO) ;
			}

			regex = "[0-9]*";
			if( gender.length() != 1 || !paramChk(regex, gender) ){
				errMessage = "성별 비정상";
				return returnPage(model , errMessage , kmcVO) ;
			}

			regex = "[0-9]*";
			if( nation.length() != 1 || !paramChk(regex, nation) ){
				errMessage = "내/외국인 비정상";
				return returnPage(model , errMessage , kmcVO) ;
			}
			
			regex = "[\\sA-Za-z가-�R.,-]*";
			if( name.length() > 60 || !paramChk(regex, name) ){
				errMessage = "성명 비정상";
				return returnPage(model , errMessage , kmcVO) ;
			}
			
			regex = "[A-Z]*";
			if( result.length() != 1 || !paramChk(regex, result) ){
				errMessage = "결과값 비정상";
				return returnPage(model , errMessage , kmcVO) ;
			}
			
			regex = "[\\sA-Za-z가-?.,-]*";
			if( M_name.length() != 0 ){
				if( M_name.length() > 60 || !paramChk(regex, M_name) ){
					errMessage = "미성년자 성명 비정상";
					return returnPage(model , errMessage , kmcVO) ;
				}
			}
			
			regex = "[0-9]*";
			if( M_birthDay.length() != 0 ){
				if( M_birthDay.length() != 8 || !paramChk(regex, M_birthDay) ){
					errMessage = "미성년자 생년월일  비정상";
					return returnPage(model , errMessage , kmcVO) ;
				}
			}

			regex = "[0-9]*";
			if( M_Gender.length() != 0 ){
				if( M_Gender.length() != 1 || !paramChk(regex, M_Gender) ){
					errMessage = "미성년자 성별 비정상";
					return returnPage(model , errMessage , kmcVO) ;
				}
			}

			regex = "[0-9]*";
			if( M_nation.length() != 0 ){
				if( M_nation.length() != 1 || !paramChk(regex, M_nation) ){
					errMessage = "미성년자 내/외국인 비정상";
					return returnPage(model , errMessage , kmcVO) ;
				}
			}
	        
			//본인인증 결과 내용 저장하기.
			/*System.out.println("+++++++++++++ getCertNum ::: "+kmcVO.getCertNum());
			System.out.println("+++++++++++++ getDate ::: "+kmcVO.getDate());
			System.out.println("+++++++++++++ getDI ::: "+kmcVO.getDI());
			System.out.println("+++++++++++++ getPhoneNo ::: "+kmcVO.getPhoneNo());
			System.out.println("+++++++++++++ getNation ::: "+kmcVO.getNation());
			System.out.println("+++++++++++++ getName ::: "+kmcVO.getName());
			System.out.println("+++++++++++++ getResult ::: "+kmcVO.getResult());
			System.out.println("+++++++++++++ getCertMet ::: "+kmcVO.getCertMet());
			System.out.println("+++++++++++++ getIp ::: "+kmcVO.getIp());*/
			
			//KMC 본인인증 정보를 세션에 담아준다.
			/*AuthCertVO certVO = new AuthCertVO();
			certVO.setCertNum(kmcVO.getCertNum());
			certVO.setCertDate(kmcVO.getDate());
			certVO.setCertDi(kmcVO.getDI());
			certVO.setCertPhone(kmcVO.getPhoneNo());
			certVO.setCertNation(kmcVO.getNation());
			certVO.setCertName(kmcVO.getName());
			certVO.setCertResult(kmcVO.getResult());
			certVO.setCertType("KMC문자인증");
			certVO.setCertIpaddr(kmcVO.getIp());
			certVO.setBirthDay(kmcVO.getBirthDay());
			certVO.setSexdstnCode(kmcVO.getGender());*/
			
			/*request.getSession().setAttribute("AuthKmcCertVO", certVO);*/
			
			/*System.out.println("++++++++++++ 세션체크22 ::: "+(MberManageVO) session.getAttribute("mberSession"));*/
			
			//KMC 본인인증 로그 insert
			AuthCertVO certVO = new AuthCertVO();
			certVO.setMberId(kmcVO.getPlusInfo());
			certVO.setCertNum(kmcVO.getCertNum());
			certVO.setCertDate(kmcVO.getDate());
			certVO.setCertDi(kmcVO.getDI());
			certVO.setCertPhone(kmcVO.getPhoneNo());
			certVO.setCertNation(kmcVO.getNation());
			certVO.setCertName(kmcVO.getName());
			certVO.setCertResult(kmcVO.getResult());
			certVO.setCertType("KMC_회원가입 인증");
			certVO.setCertIpaddr(kmcVO.getIp());
			certVO.setBirthDay(kmcVO.getBirthDay());
			certVO.setSexdstnCode(kmcVO.getGender());

			//디비 테이블에 저장하기
			mberManageService.insertCertInfoLog(certVO);
			
			kmcVO.setIdx(certVO.getIdx()); //본인인증 로그 Idx - 로그 insert 후 idx selectKey
			model.addAttribute("kmcVO", kmcVO);
			return "web/cop/kmc/authRequestAjax";
		}
		
		// 파라미터 유효성 검증 --------------------------------------------
		public Boolean paramChk(String patn, String param){
			Pattern pattern = Pattern.compile(patn);
			Matcher matcher = pattern.matcher(param);
			boolean b = matcher.matches();
			return b;
		}
		
		// 파라미터 유효성 검증 --------------------------------------------
		public String returnPage(ModelMap model , String errMessage , KmcVO kmcVO){
			kmcVO.setErrMessage(errMessage);
			model.addAttribute("kmcVO", kmcVO);
			return "web/cop/nicepay/payRequestAjax";
		}
		
		/**
		 * 세틀뱅크 가상계좌 입금 자동충전
		 *
		 * @param 
		 * @return
		 * @throws Exception
		 */
		@RequestMapping("/vcCharge.do")
		public void vcCharge(HttpServletRequest request,  HttpServletResponse response,  ModelMap model
				,@RequestParam Map<String, Object> commandMap) throws Exception {
			
			String param = (String) commandMap.get("vcp");
			System.out.println("VACS vcCharge param: " + param);
			String result = "succ";
			
			if (param != null) {
				String[] params = param.split("\\|"); // 기관코드|거래일자|거래번호
				StVcVO paramVO = new StVcVO();
				paramVO.setOrgCd(params[0]);
				paramVO.setTrIl(params[1]);
				paramVO.setTrNo(params[2]);

//				try {
					result = mjonPayService.insertVcCharge(paramVO); // 자동충전
//				} catch (Exception e) {
//					// TODO: handle exception
//				}
			} else {
				result = "fail";
			}
			
			response.setContentType("text/plain");
			PrintWriter printwriter = response.getWriter();
			printwriter.println(result);
			printwriter.flush();
			printwriter.close();
	}
			
	/**
	 * 세틀뱅크 가상계좌 리스트 업로드
	 *
	 * @param 
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/vcAccUploadAjax.do")
	public void vcAccUpload(final MultipartHttpServletRequest multiRequest,  ModelMap model
			,@RequestParam Map<String, Object> commandMap) throws Exception {
		
		List<MultipartFile> files = (List<MultipartFile>) multiRequest.getFiles("file0");
		BufferedReader br = null;
		
		for (MultipartFile file : files) {
			if(files.isEmpty()) continue;
			
			br = new BufferedReader(new InputStreamReader((InputStream) file, Charset.forName("UTF-8")));
			String line = "";
			
			while ((line = br.readLine()) != null) {
				if (line.length() < 5) continue;
				
				LOGGER.debug("가상계좌: " + line);
			}
		}
	}
		
	/**
	 * 문자나라 웹연동 SMS 전송 샘플(우체국 홈페이지에서 사용)
	 *
	 * @param 
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/cop/testMjnaraSend.do")
	public String testMjnaraSend(HttpServletRequest request, 
			ModelMap model , @RequestParam Map<String, Object> commandMap) throws Exception {

		/**
		 * 요기. 컨트롤러가 아닌 서비스나 메소드로 수정하여, 
		 * 갑질게시판 관리자 만큼 호출해서 사용하도록 변경 필요 > 이지우
		 * 
		 * 해당 메소드에 게시판ID, n명(담당자ID, 담당자전화번호)
		 * 
		 * 프로세스. 게시판 등록 컨트롤러에서 갑질게시판 등록 시 이 컨트롤러를 서비스나 메소드로 변환하여 루프로 처리 
		 */
		
		String userid        ="rlaqhal7278"; // 문자나라 아이디
		String passwd        ="dudfks0829"; // 문자나라 2차 비밀번호 dudfks0829
		String hpSender      ="01066137278"; // 보내는분 핸드폰번호
		String hpReceiver    ="01085326650"; // 받는분의 핸드폰번호
		String hpMesg        ="[우체국물류지원단 대표홈페이지] 갑질 우체통에 게시글이 등록되었습니다."; // 메시지		
//			hpMesg = URLEncoder.encode(hpMesg, "EUC-KR");

		String strUrl = "";
		strUrl = "https://www.munjanara.co.kr/MSG/send/web_admin_send.htm?userid=" + userid 
				+ "&passwd=" + passwd + "&sender=" + hpSender + "&receiver=" 
				+ hpReceiver + "&encode=0&message=" + hpMesg;
		
		BufferedReader in = null;
		StringBuffer response = new StringBuffer();
		String excpMsg = "";
		
		try {
			URL obj = new URL(strUrl); // 호출할 url
			HttpURLConnection con = (HttpURLConnection)obj.openConnection();
			con.setRequestMethod("GET");
//				in = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
			in = new BufferedReader(new InputStreamReader(con.getInputStream(), "EUC-KR"));
			
			System.out.print("문자나라 전송결과: ");

			String line;
			while((line = in.readLine()) != null) { // response를 차례대로 출력
				System.out.println(line);
				response.append(line);
			}
			
			if(in != null) try { in.close(); } catch(Exception e) { System.out.print("문자나라 전송 ERROR : " + e.getMessage()); }
		} catch(Exception e) {
			excpMsg = e.getMessage();
			System.out.print("문자나라 전송 ERROR : " + excpMsg);
		} finally {
			if(in != null) try { in.close(); } catch(Exception e) { System.out.print("문자나라 전송 ERROR : " + e.getMessage()); }
			
			String result = response.toString(); // 문자나라 전송결과 리턴값. 코드|메세지 (9|"성공" , 1|"필수전달값이 빠짐" 등 문자나라 사이트 참조)
			/*
			 * 요기. 전송내역 insert 필요 > 이지우
			 * 1. 전송내역 테이블 생성(IDX, 전송일시, 전송결과 코드, 전송결과 메세지, 게시글번호, 담당자ID, 담당자전화번호)
			 * 2. 전송내역 insert
			 *   2-1 result 리턴값이 없고, excpMsg 값이 있다면, 전송자체 오류건으로 insert(전송결과 -1, 전송결과메세지 excpMsg)
			 */
		}
		
		model.addAttribute("sendResult", "전송결과: " + response.toString());
		return "cop/testMjnaraSend";
	}
		
	/**
     * 캐시 리스트
     * @param searchVO
     * @param model
     * @return	"/uss/ion/msg/SendNumberList"
     * @throws Exception
     */
    @RequestMapping(value= {"/uss/ion/pay/PointList.do"})
	public String pointList(@ModelAttribute("searchVO") MjonPayVO mjonPayVO, 
			HttpServletRequest request,
			ModelMap model) throws Exception{
    	
    	String pattern = (String) request.getAttribute(
                HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE) ;
    	
		/** pageing */
		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(mjonPayVO.getPageIndex());
		paginationInfo.setRecordCountPerPage(mjonPayVO.getPageUnit());
		paginationInfo.setPageSize(mjonPayVO.getPageSize());
		
		mjonPayVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
		mjonPayVO.setLastIndex(paginationInfo.getLastRecordIndex());
		mjonPayVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
		
		if("".equals(mjonPayVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
			mjonPayVO.setSearchSortCnd("frstRegistPnttm");
			mjonPayVO.setSearchSortOrd("desc");
		}
		
		if(null == mjonPayVO.getSearchCondition2()) { //최초조회시 (미삭제 만 보이게)
			mjonPayVO.setSearchCondition2("N");
		}
		
        List<MjonPayVO> resultList = mjonPayService.selectPointList(mjonPayVO);
        model.addAttribute("resultList", resultList);
        paginationInfo.setTotalRecordCount(resultList.size() > 0 ? ((MjonPayVO)resultList.get(0)).getTotCnt() : 0);
		model.addAttribute("paginationInfo", paginationInfo);
		
		return "/uss/ion/pay/PointList";
	}
	    
    /**
     * 포인트 등록/수정
     * @param searchVO
     * @param model
     * @return	"/uss/ion/pay/PointModify.do"
     * @throws Exception
     */
    @RequestMapping(value = {"/uss/ion/pay/PointModify.do"})
    public String PointModify(
            @ModelAttribute("searchVO") MjonPayVO searchVO, 
            HttpServletRequest request ,
            Model model) throws Exception {
    	
    	String pattern = (String) request.getAttribute(
                HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE) ;
    	
    	MjonPayVO mjonPayVO = new MjonPayVO(); 
    	if(null != searchVO.getPointId() &&  !"".equals(searchVO.getPointId())) { //수정
    		mjonPayVO  = mjonPayService.selectPointVO(searchVO);
    	}
		model.addAttribute("mjonPayVO", mjonPayVO);
		model.addAttribute("searchVO", searchVO);
		return "/uss/ion/pay/PointModify";
    }
	    

	    
    /**
     * * 캐시  등록
     * @param searchVO
     * @param model
     * @return	"/uss/ion/pay/CashInsert.do"
     * @throws Exception
     */
    @RequestMapping(value = {"/uss/ion/pay/InsertPoint.do"})
    public String insertPoint(
            @ModelAttribute("searchVO") MjonPayVO mjonPayVO, 
            HttpServletRequest request , RedirectAttributes redirectAttributes,
            Model model) throws Exception {
    	
    	String pattern = (String) request.getAttribute(
                HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE) ;
    	
    	try {
    		LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
        	String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
        	mjonPayVO.setFrstRegisterId(userId);
        	mjonPayService.insertPoint(mjonPayVO);
    	}catch(Exception e) {
    		
    	}
    	redirectAttributes.addFlashAttribute("message", "등록이 완료되었습니다.");
		RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/uss/ion/pay/PointList.do");
		return redirectUrlMaker.getRedirectUrl();
    }
	    
    
    /**
     * 포인트 캐쉬 삭제 프로세서(del_flag : Y로 업데이트)
     * @param searchVO
     * @param model
     * @return	"/uss/ion/pay/CashDelete.do"
     * @throws Exception
     */
    @RequestMapping(value = {"/uss/ion/pay/PointDelete.do"})
    public String pointDelete(
    		@RequestParam("del") String[] del,
    		@ModelAttribute("searchVO") MjonPayVO mjonPayVO, 
            HttpServletRequest request , RedirectAttributes redirectAttributes,
            Model model) throws Exception {
    	try {
    		LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
        	String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
        	for(String id: del) {
        		mjonPayVO.setPointId(id);
        		mjonPayVO.setDelFlag("Y"); //삭제 Y로 업데이트
        		mjonPayService.deletePoint(mjonPayVO);
     	    }
    		redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.update"));
    		RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/uss/ion/pay/PointList.do");
    		return redirectUrlMaker.getRedirectUrl();
    	}catch(Exception e) {
    		redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.update"));
    	}
    	redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.delete"));
		RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/uss/ion/pay/PointList.do");
		return redirectUrlMaker.getRedirectUrl();
    }
    
    
    /**
     * 캐쉬 수정.
     * @param searchVO
     * @param hpcmVO
     * @param bindingResult
     * @return	"forward:/uss/ion/pay/UpdateCash"
     * @throws Exception
     */
    @RequestMapping(value = {"/uss/ion/pay/UpdatePoint.do"})
    public String updatePoint(
            MjonPayVO mjonPayVO, HttpServletRequest request , 
            RedirectAttributes redirectAttributes
            )
            throws Exception {

    	String pattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE) ;
    	
    	LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
    	String	lastUpdusrId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
    	try {
    		mjonPayVO.setLastUpdusrId(lastUpdusrId);
    		mjonPayService.deletePoint(mjonPayVO);   // 상태만 업데이트
    	}catch(Exception e) {
    		redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.update"));
    	}
    	redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.update"));
		RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/uss/ion/pay/PointList.do");
		return redirectUrlMaker.getRedirectUrl();
    }
    
    
    /**
   	 * 입력한 사용자아이디의 중복여부를 체크하여 사용가능여부를 확인
   	 * @param commandMap 파라메터전달용 commandMap
   	 * @param model 화면모델
   	 * @return uss/umt/EgovIdDplctCnfirm
   	 * @throws Exception
   	 */
   	@RequestMapping(value = "/uss/umt/user/ExistMemberIdAjax.do")
   	public ModelAndView EgovIdDplctCnfirmAjax(@RequestParam Map<String, Object> commandMap) throws Exception {

       	ModelAndView modelAndView = new ModelAndView();
       	modelAndView.setViewName("jsonView");

   		String checkId = (String) commandMap.get("checkId");
   		int usedCnt = userManageService.checkIdDplct(checkId);
   		modelAndView.addObject("usedCnt", usedCnt);
   		modelAndView.addObject("checkId", checkId);

   		return modelAndView;
   	}
   	
    /**
     * 요금안내/견적내기
     * @param searchVO
     * @param model
     * @return	"web/cop/bbs/NoticeList.do"
     * @throws Exception
     */
    @RequestMapping(value= {"/web/pay/PayGuide.do"})
	public String PayGuide(@ModelAttribute("searchVO") MjonPayVO mjonPayVO, @RequestParam(value = "selected", defaultValue="a") String selected,  
			HttpServletRequest request,
			RedirectAttributes redirectAttributes,
			ModelMap model) throws Exception{
    	LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
    	String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
    	
    	MberManageVO mberManageVO = null;
    	
    	if(!userId.equals("")) {
    		mberManageVO = mberManageService.selectMber(loginVO.getId());
        	model.addAttribute("mberManageVO", mberManageVO);
        	
        	MjonCandidateVO mjonCandidateVO = new MjonCandidateVO();
        	if(userId != "") { 
        		mjonCandidateVO = mjonCandidateService.selectCandidateDataInfo(userId);
        		model.addAttribute("mjonCandidateVO",mjonCandidateVO);
        	}
		}
    	
    	//개별문자 가격 및 총 금액 셋팅해주기 - 시스템 기본 단가기준으로 입력해줌
    	//1.시스템 기본 단가 정보 불러오기
    	JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo();
    	
		// 등급제 단가 추출 => 시스템 단가에 적용
		sysJoinSetVO = mberGrdService.selectMberGrdDefaultInfo(sysJoinSetVO, userId);    	
    	
    	float shortPrice = 0;			// 단문(SMS)		
    	float longPrice = 0;			// 장문(LMS)
    	float picturePrice = 0;			// 그림문자(MMS) 1장
    	float picturePrice2 = 0;		// 그림문자(MMS) 2장
    	float picturePrice3 = 0;		// 그림문자(MMS) 3장
    	String customSamplePrice = "0";	// 문자온 샘플 수정(글자, 색상, 폰트 등)
    	String customEditPrice = "0";		// 이미지 편집(첨부이미지 1장)
    	String customEdit3Price = "0";		// 이미지 편집(첨부이미지 3장이하)
    	String customTextPrice = "0";		// 텍스트 단순수정    	
    	float kakaoAtPrice = 0;				// 카카오 알림톡 
    	float faxPrice = 0;					// 팩스
    	
    	shortPrice = sysJoinSetVO.getShortPrice();
    	longPrice = sysJoinSetVO.getLongPrice();
    	picturePrice = sysJoinSetVO.getPicturePrice();
    	picturePrice2 = sysJoinSetVO.getPicture2Price();
    	picturePrice3 = sysJoinSetVO.getPicture3Price();
    	
    	DecimalFormat df = new DecimalFormat("###,###");
    	customSamplePrice = df.format(sysJoinSetVO.getCustomSamplePrice());
    	customEditPrice = df.format(sysJoinSetVO.getCustomEditPrice());
    	customEdit3Price = df.format(sysJoinSetVO.getCustomEdit3Price());
    	customTextPrice = df.format(sysJoinSetVO.getCustomTextPrice());    	    	
    	
    	kakaoAtPrice = sysJoinSetVO.getKakaoAtPrice();
    	faxPrice = sysJoinSetVO.getFaxPrice();
    	
    	// 회원로그인시 협의된 단가
    	if (mberManageVO != null && (double)mberManageVO.getShortPrice() > 0) {
 	    	shortPrice = mberManageVO.getShortPrice();
 	    	longPrice = mberManageVO.getLongPrice();
 	    	picturePrice = mberManageVO.getPicturePrice();
 	    	picturePrice2 = mberManageVO.getPicture2Price();
 	    	picturePrice3 = mberManageVO.getPicture3Price();
    	}
    	
    	if (mberManageVO != null && (double)mberManageVO.getKakaoAtPrice() > 0) {
 	    	kakaoAtPrice = mberManageVO.getKakaoAtPrice();
    	}
    	
    	if (mberManageVO != null && (double)mberManageVO.getFaxPrice() > 0) {
 	    	faxPrice = mberManageVO.getFaxPrice();
    	}
    	
    	model.addAttribute("shortPrice", shortPrice);
    	model.addAttribute("longPrice", longPrice);
    	model.addAttribute("picturePrice", picturePrice);
    	model.addAttribute("picturePrice2", picturePrice2);
    	model.addAttribute("picturePrice3", picturePrice3);
    	model.addAttribute("customSamplePrice", customSamplePrice);
    	model.addAttribute("customEditPrice", customEditPrice);
    	model.addAttribute("customEdit3Price", customEdit3Price);
    	model.addAttribute("customTextPrice", customTextPrice);
    	model.addAttribute("kakaoAtPrice", kakaoAtPrice);
    	model.addAttribute("faxPrice", faxPrice);
    	model.addAttribute("SysJoinSetVO", sysJoinSetVO);
    	
    	// 탭이동
    	String tabType = "1";
    	if(request.getParameter("tabType") != null) {
    		tabType = request.getParameter("tabType");
   		}
    	model.addAttribute("tabType", tabType);
    	
    	MberGrdVO mberGrdVO = new MberGrdVO();
    	List<MberGrdVO> mberGrdSettingList = mberGrdService.selectMberGrdSettingList(mberGrdVO);
    	model.addAttribute("mberGrdSettingList", mberGrdSettingList);
    	
		return "/web/pay/PayGuide";
	}
    
    /**
     * 요금안내/견적내기
     * @param searchVO
     * @param model
     * @return	"web/cop/bbs/NoticeList.do"
     * @throws Exception
     */
    @RequestMapping(value= {"/web/pay/PayEstimateAjax.do"})
	public String PayEstimateAjax(@ModelAttribute("searchVO") MjonPayVO mjonPayVO, @RequestParam(value = "selected", defaultValue="a") String selected,  
			HttpServletRequest request,
			ModelMap model) throws Exception{
    	
    	//개별문자 가격 및 총 금액 셋팅해주기 - 시스템 기본 단가기준으로 입력해줌
    	//1.시스템 기본 단가 정보 불러오기
    	JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo();
    	float shortPrice = 0;		// 단문(SMS)		
    	float longPrice = 0;		// 장문(LMS)
    	float picturePrice = 0;		// 그림문자(MMS) 1장
    	float picturePrice2 = 0;	// 그림문자(MMS) 2장
    	float picturePrice3 = 0;	// 그림문자(MMS) 3장
    	
    	shortPrice = sysJoinSetVO.getShortPrice();
    	longPrice = sysJoinSetVO.getLongPrice();
    	picturePrice = sysJoinSetVO.getPicturePrice();
    	picturePrice2 = sysJoinSetVO.getPicturePrice();
    	picturePrice3 = sysJoinSetVO.getPicturePrice();
    	
    	model.addAttribute("shortPrice", shortPrice);
    	model.addAttribute("longPrice", longPrice);
    	model.addAttribute("picturePrice", picturePrice);
    	model.addAttribute("picturePrice2", picturePrice2);
    	model.addAttribute("picturePrice3", picturePrice3);
    	model.addAttribute("SysJoinSetVO", sysJoinSetVO);
    	
    	// 파라미터
    	request.setCharacterEncoding("UTF-8");
    	String isVat = request.getParameter("isVat");		
    	String title = request.getParameter("title");		// 제목
    	String recipientName = request.getParameter("recipientName");		// 수신자
    	String managerName = request.getParameter("managerName");			// 담당자(성명)
    	String mobile = request.getParameter("mobile");						// 연락처
    	String publishDate = request.getParameter("publishDate");			// 발행일
    	
    	DecimalFormat decFormat = new DecimalFormat("###,###");
    	/**** JSONArray 받는 방법 ****/
        String jsonStr = request.getParameter("smsList");		// request로 문자열형식의 데이터를 받고
        JSONArray jsonArr = new JSONArray();
        JSONParser parser = new JSONParser();
        jsonArr = (JSONArray)parser.parse(jsonStr);				// 문자열 형식의 데이터를 JSONArray로 가공
    	// 데이터의 길이만큼 반복 및 JSONObject로 변환하며 확인
        for(int i=0;i<jsonArr.size();i++) {
        	JSONObject jsonObj = (JSONObject)jsonArr.get(i);
        	
        	double vatPrice = 0.0;
        	double supplyPrice = 0.0;
        	double totPrice = 0.0;

        	if (isVat.equals("1")) {
        		// 부가세 포함
        		vatPrice = (Double.parseDouble(jsonObj.get("supplyPrice").toString()) * 0.1);
        		supplyPrice = Double.parseDouble(jsonObj.get("supplyPrice").toString());
        		totPrice = (Double.parseDouble(jsonObj.get("totPrice").toString()) + vatPrice);

            	jsonObj.put("vatPrice", decFormat.format(vatPrice));
            	jsonObj.put("supplyPrice", decFormat.format(supplyPrice));
            	jsonObj.put("totPrice", decFormat.format(totPrice));
        	}
        	else {
        		// 부가세 별도(부가세 : 0)
        		vatPrice = 0;
            	supplyPrice = (Double.parseDouble(jsonObj.get("supplyPrice").toString()) - vatPrice);
            	totPrice = Double.parseDouble(jsonObj.get("totPrice").toString());

        		jsonObj.put("vatPrice", decFormat.format(vatPrice));
        		jsonObj.put("supplyPrice", decFormat.format(supplyPrice));
            	jsonObj.put("totPrice", decFormat.format(totPrice));
        	}
        }

    	String supplySumPrice = request.getParameter("supplySumPrice");		// 공급가액
    	String vatSumPrice = request.getParameter("vatSumPrice");			// 부가세액
    	String totSumPrice = request.getParameter("totSumPrice");			// 합계    	
    	String isVatStr = "";
    	if (isVat.equals("1")) {
    		isVatStr = "VAT 포함";
    	}
    	else {
    		isVatStr = "VAT 별도";
    	}
    	
        model.addAttribute("smsList", jsonArr);
    	model.addAttribute("isVat", isVat);
    	model.addAttribute("isVatStr", isVatStr);
    	model.addAttribute("title", title);
    	model.addAttribute("recipientName", recipientName);
    	model.addAttribute("managerName", managerName);
    	model.addAttribute("mobile", mobile);
    	model.addAttribute("publishDate", publishDate);
    	model.addAttribute("smsList", jsonArr);
    	model.addAttribute("supplySumPrice", decFormat.format(Double.parseDouble(supplySumPrice)));
    	model.addAttribute("vatSumPrice", decFormat.format(Double.parseDouble(vatSumPrice)));
    	model.addAttribute("totSumPrice", decFormat.format(Double.parseDouble(totSumPrice)));

		return "/web/pay/PayEstimate";
	}
    
    /**
     * 결제하기
     * @param searchVO
     * @param model
     * @return	"/web/pay/PayView.do"
     * @throws Exception
     */
    @RequestMapping(value= {"/web/member/pay/PayView_OLD.do"})
	public String PayView(@ModelAttribute("mjonPayVO") MjonPayVO mjonPayVO, 
			HttpServletRequest request, RedirectAttributes redirectAttributes,
			ModelMap model) throws Exception{
    	
    	String pattern = (String) request.getAttribute(
                HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE) ;
    	
    	//로그인 정보 획득
//    	LoginVO loginVO = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
    	LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
    	String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
    	
		if(loginVO == null) {
			//redirectAttributes.addFlashAttribute("message", "문자온 서비스는 로그인 후 이용 가능합니다.");
			return "redirect:/web/user/login/login.do";
		}
		
		MberManageVO mberManageVO = mberManageService.selectMber(loginVO.getId());
    	model.addAttribute("mberManageVO", mberManageVO);
    	
    	MjonCandidateVO mjonCandidateVO = new MjonCandidateVO();
    	if(userId != "") { 
    		mjonCandidateVO = mjonCandidateService.selectCandidateDataInfo(userId);
    		model.addAttribute("mjonCandidateVO",mjonCandidateVO);
    	}		
		
    	mjonPayVO.setReturnURL(request.getRequestURL().toString().split("pay")[0] + "nicepay/payResultAjax.do") ;
    	
		/** pageing */
		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(mjonPayVO.getPageIndex());
		paginationInfo.setRecordCountPerPage(mjonPayVO.getPageUnit());
		paginationInfo.setPageSize(mjonPayVO.getPageSize());
		
		mjonPayVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
		mjonPayVO.setLastIndex(paginationInfo.getLastRecordIndex());
		mjonPayVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
		
		if("".equals(mjonPayVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
			mjonPayVO.setSearchSortCnd("moid");
			mjonPayVO.setSearchSortOrd("desc");
		}
		mjonPayVO.setUserId(loginVO.getId());
		
        /*List<MjonPayVO> resultList = mjonPayService.selectPayList(mjonPayVO);*/   
        
        /*model.addAttribute("resultList", resultList);
        paginationInfo.setTotalRecordCount(resultList.size() > 0 ? ((MjonPayVO)resultList.get(0)).getTotCnt() : 0);*/
		/*model.addAttribute("paginationInfo", paginationInfo);*/
		
		//대상 리스트 가져오기    
		VacsVactVO vacsVactVO = new VacsVactVO();
		vacsVactVO.setMberId(loginVO.getId());
    	//List<?> bankList = vacsVactService.selectBankAcctList(tempVO);		//할당 가능한 계좌 수량  리스트 받아오기
    	List<?> bankList = vacsVactService.selectBankAcctAllList(vacsVactVO);		//할당 가능한 계좌 수량  리스트 받아오기
    	List<?> myBankList = vacsVactService.selectMyBankAcctList(vacsVactVO);		//내가 할당받은 전용계좌 리스트 받아오기
    	
    	MjonVaMsgLogVO vaMsgLogVO = new MjonVaMsgLogVO();
    	vaMsgLogVO.setMberId(loginVO.getId());
    	
    	Date now = new Date();
    	SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
		String date = sdf.format(now);
		vaMsgLogVO.setSendDate(date);
		
    	MjonVaMsgLogVO resultMsgInfo = mjonPayService.selectMyAcctSendCnt(vaMsgLogVO);
    	
    	//대상 리스트, 페이징 정보 전달
    	model.addAttribute("resultList", bankList);
    	model.addAttribute("resultMyList", myBankList);
    	model.addAttribute("resultMsgInfo", resultMsgInfo);
    	model.addAttribute("mjonPayVO", mjonPayVO);
    	
    	// 탭이동
    	String tabType = "1";
    	if(request.getParameter("tabType") != null) {
    		tabType = request.getParameter("tabType");
   		}
    	model.addAttribute("tabType", tabType);
    	
    	MberGrdVO mberGrdVO = new MberGrdVO();
    	List<MberGrdVO> mberGrdSettingList = mberGrdService.selectMberGrdSettingList(mberGrdVO);
    	model.addAttribute("mberGrdSettingList", mberGrdSettingList);
    	
		return "/web/pay/PayView_OLD";
	}
    
    /**
     * 요금결제내역
     * @param searchVO
     * @param model
     * @return	"/web/member/pay/PayList.do"
     * @throws Exception
     */
    @RequestMapping(value= {"/web/member/pay/PayList.do" , 
    			"/web/member/pay/PayListAllAjax.do",
    			"/web/member/pay/PayListMobileAjax.do",
    			"/web/member/pay/PayListCardAjax.do",
    			"/web/member/pay/PayListVBankAjax.do",
    			"/web/member/pay/PayListBankAjax.do",
    			"/web/member/pay/PayListSPayAjax.do",
    			"/web/member/pay/PayListOfflineAjax.do",
    			"/web/member/pay/PayListRefundAjax.do"
    			})
	public String PayList(@ModelAttribute("searchVO") MjonPayVO mjonPayVO, 
			HttpServletRequest request, RedirectAttributes redirectAttributes,
			ModelMap model) throws Exception{
    	
    	String pattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE) ;
    	
    	//세금계산서, 현금영수증 정보 조회
    	/*LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();*/
		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
		if(loginVO == null) {
			//redirectAttributes.addFlashAttribute("message", "문자온 서비스는 로그인 후 이용 가능합니다.");
			return "redirect:/web/user/login/login.do";
		}
    	MberManageVO mberManageVO = mberManageService.selectMber(loginVO.getId());

    	//개인주민번호 있을경우만 불러오기 수정(2022.0415)
    	if(mberManageVO.getIhidnum() != null) {
    		mberManageVO.setIhidnum(egovCryptoUtil.decrypt(mberManageVO.getIhidnum()));
    	}
    	model.addAttribute("mberManageVO", mberManageVO);
    	
    	//선거 후보자 정보 불러오기
		MjonCandidateVO mjonCandidateVO = new MjonCandidateVO();
		if(userId != ""){
			
			mjonCandidateVO = mjonCandidateService.selectCandidateDataInfo(userId);
			
			//String cryptText = egovCryptoUtil.encrypt(plainText);

			if(mjonCandidateVO != null) {
				
				// 주민번호 복호화 하기
				String regidentNo1 = egovCryptoUtil.decrypt(mjonCandidateVO.getRegidentNo1());
				String regidentNo2 = egovCryptoUtil.decrypt(mjonCandidateVO.getRegidentNo2());
				
				mjonCandidateVO.setRegidentNo1(regidentNo1);
				mjonCandidateVO.setRegidentNo2(regidentNo2);
				
			}
			
		}
		
		model.addAttribute("mjonCandidateVO", mjonCandidateVO);
    	
		/*
    	if(pattern.equals("/web/member/pay/PayListAllAjax.do")) { 
			// 등급제 Start
	   		// 회원별 등급 적용
			MberGrdVO mberGrdVO = new MberGrdVO();
			mberGrdVO.setMberId(userId);
	    	mberGrdVO.setAmt("0");
	    	mberGrdVO.setMoid("");
	   		mberGrdService.mberGrdSaveByUserNoHist(mberGrdVO);    		
			// End	    	
    	}
    	*/
    	
    	if(pattern.equals("/web/member/pay/PayListAllAjax.do")
    			|| pattern.equals("/web/member/pay/PayListMobileAjax.do")
    			|| pattern.equals("/web/member/pay/PayListCardAjax.do")
    			|| pattern.equals("/web/member/pay/PayListVBankAjax.do")
    			|| pattern.equals("/web/member/pay/PayListBankAjax.do")
    			|| pattern.equals("/web/member/pay/PayListSPayAjax.do")
    			|| pattern.equals("/web/member/pay/PayListOfflineAjax.do")
    			|| pattern.equals("/web/member/pay/PayListRefundAjax.do")
    		) { //전체 , 모바일, 신용카드
			//resultList = mjonMsgService.selectMjonMsgGroupDtList(searchVO);
    		/** pageing */
    		PaginationInfo paginationInfo = new PaginationInfo();
    		paginationInfo.setCurrentPageNo(mjonPayVO.getPageIndex());
    		paginationInfo.setRecordCountPerPage(mjonPayVO.getPageUnit());
    		paginationInfo.setPageSize(mjonPayVO.getPageSize());
    		
    		mjonPayVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
    		mjonPayVO.setLastIndex(paginationInfo.getLastRecordIndex());
    		mjonPayVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
    		
        	mjonPayVO.setUserId(userId);
        	//횐불요청 페이지 처리
        	if(pattern.equals("/web/member/pay/PayListRefundAjax.do")) { 
    			
    			RefundVO refundVO = new RefundVO();
    			
    			//환불 요청 리스트 정보 셋팅하기
            	refundVO.setSearchSortCnd(mjonPayVO.getSearchSortCnd());
    			refundVO.setSearchSortOrd(mjonPayVO.getSearchSortOrd());
    			
    			if("".equals(refundVO.getSearchSortCnd())) {
    				
    				refundVO.setSearchSortCnd("refundId");
        			refundVO.setSearchSortOrd("desc");
    				
    			}else {
    				
    				String sortCnd = refundVO.getSearchSortCnd();
    				
    				if(sortCnd.equals("moid") || sortCnd.equals("pointUseId") || sortCnd.equals("type")) {//결제아이디, 포인트 아이디, 포인트 교환 방식
    					refundVO.setSearchSortCnd("refundId");
    				}else if(sortCnd.equals("regDate") || sortCnd.equals("frstRegistPnttm")) {//결제일자,
    					refundVO.setSearchSortCnd("frstRegisterPnttm");
    				}else if(sortCnd.equals("amt") || sortCnd.equals("cash") || sortCnd.equals("point")) {//결제금액
    					refundVO.setSearchSortCnd("refundMoney");
    				}else if(sortCnd.equals("amt") || sortCnd.equals("cash") || sortCnd.equals("point")) {//결제금액
    					refundVO.setSearchSortCnd("refundMoney");
    				}else if(sortCnd.equals("cmpltYn") || sortCnd.equals("pgStatusTxt")) {
    					refundVO.setSearchSortCnd("refundStatus");
    				}
    				
    				refundVO.setSearchSortOrd(mjonPayVO.getSearchSortOrd());
    				
    			}
            	
            	refundVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
            	refundVO.setLastIndex(paginationInfo.getLastRecordIndex());
            	refundVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
    			
    			//회원 ID, 이름, 비밀번호, 캐쉬조회
            	refundVO.setMberId(loginVO.getId());
            	RefundVO resultRefundVO = refundService.selectRefundMberInfo(refundVO);
            	
            	String refundListType = mjonPayVO.getRefundListType();
            	
            	if(refundListType == null || refundListType.equals("")) {
            		
            		mjonPayVO.setRefundListType("tab1");
            		
            	}
            	
            	model.addAttribute("resultRefundVO", resultRefundVO);
            	
            	refundVO.setStartDate(mjonPayVO.getStartDate());
            	refundVO.setEndDate(mjonPayVO.getEndDate());
            	
            	//환불 요청 리스트 조회하기
            	List<RefundVO> refundList = refundService.selectRefundList(refundVO);
                int totCnt = 0;
                if(refundList.size() > 0) {
        			totCnt = refundList.get(0).getTotCnt();
        		}
                
                paginationInfo.setTotalRecordCount(refundList.size() > 0 ? ((RefundVO)refundList.get(0)).getTotCnt() : 0);
                model.addAttribute("paginationInfo", paginationInfo);
                model.addAttribute("refundList", refundList);
                model.addAttribute("refundVO", refundVO);
            	
    			return "/web/pay/PayListRefundAjax";
    		}
        	
        	//일반 결제 페이지 처리
    		if("".equals(mjonPayVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
    			mjonPayVO.setSearchSortCnd("moid");
    			mjonPayVO.setSearchSortOrd("desc");
    		}else {//포인트 교환내역에서 정렬 종류가 달라서 변환처리 해줌
    			
    			String sortCnt = mjonPayVO.getSearchSortCnd();
    			
    			if(sortCnt.equals("pointUseId") || sortCnt.equals("refundId")) {
    				mjonPayVO.setSearchSortCnd("moid");
    			}else if(sortCnt.equals("frstRegistPnttm") || sortCnt.equals("frstRegisterPnttm") || sortCnt.equals("refundHandlePnttm")) {
    				mjonPayVO.setSearchSortCnd("regDate");
    			}else if(sortCnt.equals("type")) {
    				mjonPayVO.setSearchSortCnd("payMethodTxt");
    			}else if(sortCnt.equals("point") || sortCnt.equals("refundMoney") || sortCnt.equals("refundCash")) {
    				mjonPayVO.setSearchSortCnd("amt");
    			}else if(sortCnt.equals("cmpltYn") || sortCnt.equals("refundStatus")) {
    				mjonPayVO.setSearchSortCnd("pgStatusTxt");
    			}
    			
    		}
    		
			if(pattern.equals("/web/member/pay/PayListAllAjax.do")) { //전체
    			mjonPayVO.setPageType("all");
    		}
    		if(pattern.equals("/web/member/pay/PayListMobileAjax.do")) { //모바일일때
    			mjonPayVO.setSearchCondition2("CELLPHONE");
    			mjonPayVO.setPayMethod("CELLPHONE");
    			mjonPayVO.setPageType("cellphone");
    		}
    		if(pattern.equals("/web/member/pay/PayListCardAjax.do")) { //신용카드
    			mjonPayVO.setSearchCondition2("CARD");
    			mjonPayVO.setPayMethod("CARD");
    			mjonPayVO.setPageType("card");
    		}
    		if(pattern.equals("/web/member/pay/PayListVBankAjax.do")) { //전용계좌
    			mjonPayVO.setSearchCondition2("VBANK");
    			mjonPayVO.setPayMethod("VBANK");
    			mjonPayVO.setPageType("vbank");
    		}
    		if(pattern.equals("/web/member/pay/PayListBankAjax.do")) { //즉시이체
    			mjonPayVO.setSearchCondition2("BANK");
    			mjonPayVO.setPayMethod("BANK");
    			mjonPayVO.setPageType("bank");
    		}    		
    		if(pattern.equals("/web/member/pay/PayListSPayAjax.do")) { //즉시이체
    			mjonPayVO.setSearchCondition2("SPAY");
    			mjonPayVO.setPayMethod("SPAY");
    			mjonPayVO.setPageType("SPAY");
    		}    		    		
    		if(pattern.equals("/web/member/pay/PayListOfflineAjax.do")) { //무통장
    			mjonPayVO.setSearchCondition2("OFFLINE");
    			mjonPayVO.setPayMethod("OFFLINE");
    			mjonPayVO.setPageType("offline");
    		}    		
    		
    				
    		/*LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
        	String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
        	mjonPayVO.setUserId(userId);*/
        	
    		// 이메일 코드조회
			ComDefaultCodeVO voComCode = new ComDefaultCodeVO();
			voComCode.setCodeId("ITN031");
			model.addAttribute("emailCode", cmmUseService.selectCmmCodeDetail(voComCode));
    		
    		//결제 리스트 정보 불러오기
            List<MjonPayVO> resultList = mjonPayService.selectPayList(mjonPayVO);   
            
            model.addAttribute("resultList", resultList);
            paginationInfo.setTotalRecordCount(resultList.size() > 0 ? ((MjonPayVO)resultList.get(0)).getTotCnt() : 0);
    		model.addAttribute("paginationInfo", paginationInfo);
    		
    		return "/web/pay/PayListAllAjax";
		}
    	
		return "/web/pay/PayList";
	}
    
    /**
     * 포인트 전환내역
     * @param searchVO
     * @param model
     * @return	"/web/member/pay/PayList.do"
     * @throws Exception
     */
    @RequestMapping(value= {"/web/member/pay/PayListPointAjax.do"})
	public String PoinUseList(@ModelAttribute("searchVO") MjonPayVO mjonPayVO, 
			HttpServletRequest request, 
			RedirectAttributes redirectAttributes,
			ModelMap model) throws Exception{
    	
    	String pattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE) ;
    	
    	//세금계산서, 현금영수증 정보 조회
    	/*LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();*/
		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
		if(loginVO == null) {
			//redirectAttributes.addFlashAttribute("message", "문자온 서비스는 로그인 후 이용 가능합니다.");
			return "redirect:/web/user/login/login.do";
		}
		
		/** pageing */
		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(mjonPayVO.getPageIndex());
		paginationInfo.setRecordCountPerPage(mjonPayVO.getPageUnit());
		paginationInfo.setPageSize(mjonPayVO.getPageSize());
		
		mjonPayVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
		mjonPayVO.setLastIndex(paginationInfo.getLastRecordIndex());
		mjonPayVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
		
		mjonPayVO.setType("1"); 	// 현금
		mjonPayVO.setUserId(userId);
		
		if("".equals(mjonPayVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
			mjonPayVO.setSearchSortCnd("pointUseId");
			mjonPayVO.setSearchSortOrd("desc");
		}else {//포인트 교환내역에서 정렬 종류가 달라서 변환처리 해줌
			
			String sortCnt = mjonPayVO.getSearchSortCnd();
			
			if(sortCnt.equals("moid") || sortCnt.equals("refundId")) {
				mjonPayVO.setSearchSortCnd("pointUseId");
			}else if(sortCnt.equals("regDate") || sortCnt.equals("refundHandlePnttm") || sortCnt.equals("frstRegisterPnttm")) {
				mjonPayVO.setSearchSortCnd("frstRegistPnttm");
			}else if(sortCnt.equals("payMethodTxt")) {
				mjonPayVO.setSearchSortCnd("type");
			}else if(sortCnt.equals("amt") || sortCnt.equals("cash") || sortCnt.equals("refundMoney") || sortCnt.equals("refundCash")) {
				mjonPayVO.setSearchSortCnd("point");
			}else if(sortCnt.equals("pgStatusTxt") || sortCnt.equals("refundStatus")) {
				mjonPayVO.setSearchSortCnd("cmpltYn");
			}
			
		}
		
        List<MjonPayVO> resultList = mjonPayService.selectPointUseList(mjonPayVO);
        model.addAttribute("resultList", resultList);
        paginationInfo.setTotalRecordCount(resultList.size() > 0 ? ((MjonPayVO)resultList.get(0)).getTotCnt() : 0);
		model.addAttribute("paginationInfo", paginationInfo);
		
		return "/web/pay/PayListPointAjax";
    	
    }
    
	@RequestMapping(value= {"/web/member/pay/PayPrintListPopUpAjax.do"})
	public String printMsgSentDataAjax(
			@ModelAttribute("searchVO") MjonPayVO mjonPayVO
			, RedirectAttributes redirectAttributes
			, ModelMap model) throws Exception {
		
		
		
		//로그인 권한정보 불러오기
		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
		String userNm = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getName());
		
		mjonPayVO.setUserId(userId);
		model.addAttribute("userNm", userNm);
		
		String pageType = mjonPayVO.getPageType();
		if(pageType.equals("all")) {
			
		}else if(pageType.equals("vbank")) {
			mjonPayVO.setSearchCondition2("VBANK");
			mjonPayVO.setPayMethod("VBANK");
			
		}else if(pageType.equals("card")) {
			mjonPayVO.setSearchCondition2("CARD");
			mjonPayVO.setPayMethod("CARD");
			
		}else if(pageType.equals("cellphone")) {
			mjonPayVO.setSearchCondition2("CELLPHONE");
			mjonPayVO.setPayMethod("CELLPHONE");
			
		}else if(pageType.equals("bank")) {
			mjonPayVO.setSearchCondition2("BANK");
			mjonPayVO.setPayMethod("BANK");
		}
		
		mjonPayVO.setFirstIndex(0);
		mjonPayVO.setRecordCountPerPage(10000);
		
		
		//결제 리스트 정보 불러오기
		List<MjonPayVO> resultList = mjonPayService.selectPayList(mjonPayVO);
		model.addAttribute("resultList", resultList);
		
		Calendar cal = Calendar.getInstance();

		int year = cal.get(Calendar.YEAR);
		int month = cal.get(Calendar.MONTH) + 1;
		int day = cal.get(Calendar.DAY_OF_MONTH);
		
		model.addAttribute("year", year);
		model.addAttribute("month", month);
		model.addAttribute("day", day);

		return "web/pay/PayPrintListPopUp";
	}
	
	@RequestMapping(value= {"/web/member/pay/PayPrintPointListPopUpAjax.do"})
	public String payPrintPointPrintDataAjax(
			@ModelAttribute("searchVO") MjonPayVO mjonPayVO
			, RedirectAttributes redirectAttributes
			, ModelMap model) throws Exception {
		
		//로그인 권한정보 불러오기
		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
		String userNm = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getName());
		
		mjonPayVO.setUserId(userId);
		model.addAttribute("userNm", userNm);
		
		mjonPayVO.setType("1"); 	// 현금
		mjonPayVO.setFirstIndex(0);
		mjonPayVO.setRecordCountPerPage(10000);
		
		
		//결제 리스트 정보 불러오기
		List<MjonPayVO> resultList = mjonPayService.selectPointUseList(mjonPayVO);
		model.addAttribute("resultList", resultList);
		
		Calendar cal = Calendar.getInstance();

		int year = cal.get(Calendar.YEAR);
		int month = cal.get(Calendar.MONTH) + 1;
		int day = cal.get(Calendar.DAY_OF_MONTH);
		
		model.addAttribute("year", year);
		model.addAttribute("month", month);
		model.addAttribute("day", day);

		return "web/pay/PayPrintPointListPopUp";
	}
	
	@RequestMapping(value= {"/web/member/pay/PayPrintRefundListPopUpAjax.do"})
	public String payPrintRefundPrintDataAjax(
			@ModelAttribute("searchVO") MjonPayVO mjonPayVO
			, RedirectAttributes redirectAttributes
			, ModelMap model) throws Exception {
		
		//로그인 권한정보 불러오기
		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
		String userNm = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getName());
		
		RefundVO refundVO = new RefundVO();
		refundVO.setRecordCountPerPage(100000);
		refundVO.setFirstIndex(0);
		
		if("".equals(mjonPayVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
				refundVO.setSearchSortCnd("refundId");
				refundVO.setSearchSortOrd("desc");
		}else {
			//환불 요청 리스트 정보 셋팅하기
        	refundVO.setSearchSortCnd(mjonPayVO.getSearchSortCnd());
			refundVO.setSearchSortOrd(mjonPayVO.getSearchSortOrd());
		}
			
		// JSPark 2022.03.16 => 뷰 목록과 데이터 상이
    	refundVO.setMberId(userId);
    	model.addAttribute("userNm", userNm);
    	
    	String refundListType = mjonPayVO.getRefundListType();
    	
    	if(refundListType == null || refundListType.equals("")) {
    		mjonPayVO.setRefundListType("tab1");
    	}
    	
    	refundVO.setStartDate(mjonPayVO.getStartDate());
    	refundVO.setEndDate(mjonPayVO.getEndDate());
		
		//결제 리스트 정보 불러오기
    	List<RefundVO> resultList = refundService.selectRefundList(refundVO);
		model.addAttribute("resultList", resultList);
		
		Calendar cal = Calendar.getInstance();

		int year = cal.get(Calendar.YEAR);
		int month = cal.get(Calendar.MONTH) + 1;
		int day = cal.get(Calendar.DAY_OF_MONTH);
		
		model.addAttribute("year", year);
		model.addAttribute("month", month);
		model.addAttribute("day", day);

		return "web/pay/PayPrintRefundListPopUp";
	}
	
	@RequestMapping(value= {"/web/member/pay/PayPdfListPopUpAjax.do"})
	public String payPrintPdfDataAjax(
			@ModelAttribute("searchVO") MjonMsgVO mjonMsgVO
			, RedirectAttributes redirectAttributes
			, ModelMap model) throws Exception {
		//로그인 권한정보 불러오기
		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
		String userNm = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getName());
		
		mjonMsgVO.setUserId(userId);
		model.addAttribute("userNm", userNm);
		
		mjonMsgVO.setFirstIndex(0);
		mjonMsgVO.setRecordCountPerPage(10000);
		
		//결제 리스트 정보 불러오기
		List<MjonMsgVO> payUserList =  mjonMsgDataService.selectPayUserList(mjonMsgVO);
		model.addAttribute("payUserList", payUserList);
		
		Calendar cal = Calendar.getInstance();

		int year = cal.get(Calendar.YEAR);
		int month = cal.get(Calendar.MONTH) + 1;
		int day = cal.get(Calendar.DAY_OF_MONTH);
		
		model.addAttribute("year", year);
		model.addAttribute("month", month);
		model.addAttribute("day", day);

		return "web/pay/PrintPayUserListPdfPopUp";
	}

	//사용내역 pdf저장 카카오 추가
	@RequestMapping(value= {"/web/member/pay/PayPdfWithKakaoListPopUpAjax.do"})
	public String PayPdfWithKakaoListPopUpAjax(
			@ModelAttribute("searchVO") MjonMsgVO mjonMsgVO
			, RedirectAttributes redirectAttributes
			, ModelMap model) throws Exception {
		//로그인 권한정보 불러오기
		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
		String userNm = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getName());
		
		mjonMsgVO.setUserId(userId);
		model.addAttribute("userNm", userNm);
		
		mjonMsgVO.setFirstIndex(0);
		mjonMsgVO.setRecordCountPerPage(10000);
		
		//결제 리스트 정보 불러오기
		List<MjonMsgVO> payUserList =  mjonMsgDataService.selectPayUserWithKakaoList(mjonMsgVO);
		model.addAttribute("payUserList", payUserList);
		
		Calendar cal = Calendar.getInstance();
		
		int year = cal.get(Calendar.YEAR);
		int month = cal.get(Calendar.MONTH) + 1;
		int day = cal.get(Calendar.DAY_OF_MONTH);
		
		model.addAttribute("year", year);
		model.addAttribute("month", month);
		model.addAttribute("day", day);
						
		return "web/pay/PrintPayUserWithKakaoListPdfPopUp";
	}
    
    
	/**
	 * 요금사용내역
	 * @param mjonMsgVO
	 * @param model
	 * @return	"/web/member/pay/PayUserList.do"
	 * @throws Exception
	 */
    @RequestMapping(value= {"/web/member/pay/PayUserList.do"})
	public String PayUserList(@ModelAttribute("mjonMsgVO") MjonMsgVO mjonMsgVO,
			MjonPayVO mjonPayVO,
			MberManageVO mberManageVO, RedirectAttributes redirectAttributes,
			HttpServletRequest request,
			ModelMap model) throws Exception{
		
		/*LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();*/
		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
		
		if(loginVO == null) {
			//redirectAttributes.addFlashAttribute("message", "문자온 서비스는 로그인 후 이용 가능합니다.");
			return "redirect:/web/user/login/login.do";
		}    	
		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
		mjonMsgVO.setUserId(userId);
		
		{ // 충전캐시
			String sumPayMoney = mjonPayService.selectSumPayMoney(userId); 
			model.addAttribute("sumPayMoney", sumPayMoney);
		}
		
		{ // 충전포인트
			String sumPoint = mjonPayService.selectSumPoint(userId); 
			model.addAttribute("sumPoint", sumPoint);
		}
				
		{ // 총 사용금액
			mjonPayVO.setUserId(userId);
			List<MjonPayVO>  usedCashTotList = mjonPayService.selectUsedCashWithKakaoTotCnt(mjonPayVO);	
			model.addAttribute("usedCashTotList", usedCashTotList);
		}
		{ // 사용가능한 금액
			mberManageVO = mjonMsgDataService.selectMberManageInfo(userId);
			model.addAttribute("mberManageVO", mberManageVO);
		}
		
		{ // 발송건수
			mjonMsgVO.setReserveYn("N");
			List<MjonMsgVO>  sendTotList = mjonMsgService.selectWithKakaoSendTotCnt(mjonMsgVO);
			model.addAttribute("sendTotList", sendTotList);
		}
		
		{ // 예약건수
			mjonMsgVO.setReserveYn("Y");
			List<MjonMsgVO>  reservToList = mjonMsgService.selectWithKakaoSendTotCnt(mjonMsgVO);
			model.addAttribute("reservToList", reservToList);
		}
		
		{
			MjonCandidateVO mjonCandidateVO = new MjonCandidateVO();
			if("p".equals(mberManageVO.getDept())) { //개인회원 선거 후보자 정보 불러오기
				mjonCandidateVO = mjonCandidateService.selectCandidateDataInfo(userId);
				if(mjonCandidateVO != null) {
					mjonCandidateVO.setRegidentNo1(egovCryptoUtil.decrypt(mjonCandidateVO.getRegidentNo1()));
					mjonCandidateVO.setRegidentNo2(egovCryptoUtil.decrypt(mjonCandidateVO.getRegidentNo2()));
				}
			}
			model.addAttribute("mjonCandidateVO", mjonCandidateVO);
		}
		return "/web/pay/PayUserList";
	}
    
	/**
	 * 요금사용내역 카카오 테스트용
	 * @param mjonMsgVO
	 * @param model
	 * @return	"/web/member/pay/PayUserWithKakaoList.do"
	 * @throws Exception
	 */
    @RequestMapping(value= {"/web/member/pay/PayUserWithKakaoList.do"})
	public String PayUserWithKakaoList(@ModelAttribute("mjonMsgVO") MjonMsgVO mjonMsgVO,
			MjonPayVO mjonPayVO,
			MberManageVO mberManageVO, RedirectAttributes redirectAttributes,
			HttpServletRequest request,
			ModelMap model) throws Exception{
		
		/*LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();*/
		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
		
		if(loginVO == null) {
			//redirectAttributes.addFlashAttribute("message", "문자온 서비스는 로그인 후 이용 가능합니다.");
			return "redirect:/web/user/login/login.do";
		}    	
		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
		mjonMsgVO.setUserId(userId);
		
		
		{ // 충전캐시
			String sumPayMoney = mjonPayService.selectSumPayMoney(userId); 
			model.addAttribute("sumPayMoney", sumPayMoney);
		}
		
		{ // 충전포인트
			String sumPoint = mjonPayService.selectSumPoint(userId); 
			model.addAttribute("sumPoint", sumPoint);
		}
				
		{ // 총 사용금액
			mjonPayVO.setUserId(userId);
			List<MjonPayVO>  usedCashTotList = mjonPayService.selectUsedCashWithKakaoTotCnt(mjonPayVO);	
			model.addAttribute("usedCashTotList", usedCashTotList);
		}
		{ // 사용가능한 금액
			mberManageVO = mjonMsgDataService.selectMberManageInfo(userId);
			model.addAttribute("mberManageVO", mberManageVO);
		}
		
		{ // 발송건수
			mjonMsgVO.setReserveYn("N");
			List<MjonMsgVO>  sendTotList = mjonMsgService.selectWithKakaoSendTotCnt(mjonMsgVO);
			model.addAttribute("sendTotList", sendTotList);
		}
		
		{ // 예약건수
			mjonMsgVO.setReserveYn("Y");
			List<MjonMsgVO>  reservToList = mjonMsgService.selectWithKakaoSendTotCnt(mjonMsgVO);
			model.addAttribute("reservToList", reservToList);
		}
		
		return "/web/pay/PayUserWithKakaoList";
	}    
    /**
	 * 요금사용내역
	 * @param mjonMsgVO
	 * @param model
	 * @return	"/web/member/pay/PayUserListAjax.do"
	 * @throws Exception
	 */
    @RequestMapping(value= {"/web/member/pay/PayUserListAjax.do"})
	public String PayUserListAjax(@ModelAttribute("searchVO") MjonMsgVO mjonMsgVO,
			HttpServletRequest request,
			ModelMap model) throws Exception{
		
		LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
		mjonMsgVO.setUserId(userId);
		
		if(mjonMsgVO.getPageUnit() != 10) {
			mjonMsgVO.setPageUnit(mjonMsgVO.getPageUnit());
		}
		
		/** pageing */
		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(mjonMsgVO.getPageIndex());
		paginationInfo.setRecordCountPerPage(mjonMsgVO.getPageUnit());
		paginationInfo.setPageSize(mjonMsgVO.getPageSize());

		mjonMsgVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
		mjonMsgVO.setLastIndex(paginationInfo.getLastRecordIndex());
		mjonMsgVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); 
		
		if("".equals(mjonMsgVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
			mjonMsgVO.setSearchSortCnd("regDate");
			mjonMsgVO.setSearchSortOrd("desc");
		}
		
		List<MjonMsgVO> payUserList =  mjonMsgDataService.selectPayUserList(mjonMsgVO);
		
		paginationInfo.setTotalRecordCount(payUserList.size()> 0 ? payUserList.get(0).getTotCnt() : 0);
		model.addAttribute("paginationInfo", paginationInfo);
		model.addAttribute("payUserList", payUserList);
		
		return "/web/pay/PayUserListAjax";
	}
    
    /**
     * 요금사용내역 - 카카오 테스트용
     * @param mjonMsgVO
     * @param model
     * @return	"/web/member/pay/PayUserListAjax.do"
     * @throws Exception
     */
    @RequestMapping(value= {"/web/member/pay/PayUserWithKakaoListAjax.do"})
    public String PayUserWithKakaoListAjax(@ModelAttribute("searchVO") MjonMsgVO mjonMsgVO,
    		HttpServletRequest request,
    		ModelMap model) throws Exception{
    	
    	LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
    	String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
    	mjonMsgVO.setUserId(userId);
    	
    	if(mjonMsgVO.getPageUnit() != 10) {
    		mjonMsgVO.setPageUnit(mjonMsgVO.getPageUnit());
    	}
    	
    	/** pageing */
    	PaginationInfo paginationInfo = new PaginationInfo();
    	paginationInfo.setCurrentPageNo(mjonMsgVO.getPageIndex());
    	paginationInfo.setRecordCountPerPage(mjonMsgVO.getPageUnit());
    	paginationInfo.setPageSize(mjonMsgVO.getPageSize());
    	
    	mjonMsgVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
    	mjonMsgVO.setLastIndex(paginationInfo.getLastRecordIndex());
    	mjonMsgVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); 
    	
    	if("".equals(mjonMsgVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
    		mjonMsgVO.setSearchSortCnd("regDate");
    		mjonMsgVO.setSearchSortOrd("desc");
    	}
    	
    	List<MjonMsgVO> payUserList =  mjonMsgDataService.selectPayUserWithKakaoList(mjonMsgVO);
    	
    	paginationInfo.setTotalRecordCount(payUserList.size()> 0 ? payUserList.get(0).getTotCnt() : 0);
    	model.addAttribute("paginationInfo", paginationInfo);
    	model.addAttribute("payUserList", payUserList);
    	
    	return "/web/pay/PayUserWithKakaoListAjax";
    }
    
    @RequestMapping(value= {"/web/member/pay/PrintPayUserListAjax.do"})
	public String printPayUserListAjax(
			@ModelAttribute("searchVO") MjonMsgVO mjonMsgVO
			, RedirectAttributes redirectAttributes
			, ModelMap model) throws Exception {
		//로그인 권한정보 불러오기
		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
		String userNm = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getName());
		
		mjonMsgVO.setUserId(userId);
		model.addAttribute("userNm", userNm);
		
		
		mjonMsgVO.setFirstIndex(0);
		mjonMsgVO.setRecordCountPerPage(10000);
		
		//결제 리스트 정보 불러오기
		List<MjonMsgVO> payUserList =  mjonMsgDataService.selectPayUserList(mjonMsgVO);
		model.addAttribute("payUserList", payUserList);
		
		Calendar cal = Calendar.getInstance();

		int year = cal.get(Calendar.YEAR);
		int month = cal.get(Calendar.MONTH) + 1;
		int day = cal.get(Calendar.DAY_OF_MONTH);
		
		model.addAttribute("year", year);
		model.addAttribute("month", month);
		model.addAttribute("day", day);

		return "web/pay/PrintPayUserListPopUp";
	}
    
    //사용내역 인쇄하기 카카오 추가
    @RequestMapping(value= {"/web/member/pay/PrintPayUserWithKakaoListAjax.do"})
    public String PrintPayUserWithKakaoListAjax(
    		@ModelAttribute("searchVO") MjonMsgVO mjonMsgVO
    		, RedirectAttributes redirectAttributes
    		, ModelMap model) throws Exception {
    	//로그인 권한정보 불러오기
    	LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
    	String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
    	String userNm = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getName());
    	
    	mjonMsgVO.setUserId(userId);
    	model.addAttribute("userNm", userNm);
    	
    	
    	mjonMsgVO.setFirstIndex(0);
    	mjonMsgVO.setRecordCountPerPage(10000);
    	
    	//결제 리스트 정보 불러오기
    	List<MjonMsgVO> payUserList =  mjonMsgDataService.selectPayUserWithKakaoList(mjonMsgVO);
    	model.addAttribute("payUserList", payUserList);
    	
    	Calendar cal = Calendar.getInstance();
    	
    	int year = cal.get(Calendar.YEAR);
    	int month = cal.get(Calendar.MONTH) + 1;
    	int day = cal.get(Calendar.DAY_OF_MONTH);
    	
    	model.addAttribute("year", year);
    	model.addAttribute("month", month);
    	model.addAttribute("day", day);
    	
    	return "web/pay/PrintPayUserWithKakaoListPopUp";
    }
    
    /**
     * 예약관리 문자 상세보기 내용 
     * @param searchVO
     * @param model
     * @return	"/web/member/pay/selectReservMsgDetailDataAjax.do"
     * @throws Exception
     */
	@RequestMapping(value= {"/web/member/pay/selectPayUserMsgDetailDataAjax.do"})
	public String selectPayUserMsgDetailDataAjax(@ModelAttribute("searchVO") MjonMsgVO mjonMsgVO, ModelMap model) throws Exception{
		
		//로그인 권한정보 불러오기
    	LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
    	String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
    	
    	mjonMsgVO.setUserId(userId);
    	
    	//문자 상세보기 처리
    	MjonMsgVO resultMsgDetail = mjonMsgDataService.selectPayUserMsgDetailDataAjax(mjonMsgVO);
    	model.addAttribute("resultMsgDetail", resultMsgDetail);
    	
    	//문자 상세보기 이미지 아이디 받아오기 
    	String atchFileId1 ="";
    	String atchFileId2 ="";
    	String atchFileId3 ="";
    	
    	String path1 = resultMsgDetail.getFilePath1();
    	String path2 = resultMsgDetail.getFilePath2();
    	String path3 = resultMsgDetail.getFilePath3();
    	
    	FileVO fileVO1 = new FileVO();
    	FileVO fileVO2 = new FileVO();
    	FileVO fileVO3 = new FileVO();
    	
    	if(StringUtil.isNotEmpty(path1)) {
    		
    		//파일경로 및 이름을 이용하여 atchFileId, fileExtsn 번호 받아오기
    		fileVO1 = getFilePathToAtchFileId(path1);
    		
    	}
    	
    	if(StringUtil.isNotEmpty(path2)) {
    		
    		//파일경로 및 이름을 이용하여 atchFileId, fileExtsn 번호 받아오기
    		fileVO2 = getFilePathToAtchFileId(path2);
    		
    	}
    	

		if(StringUtil.isNotEmpty(path3)) {
			
			//파일경로 및 이름을 이용하여 atchFileId, fileExtsn 번호 받아오기
			fileVO3 = getFilePathToAtchFileId(path3);
			
		}
    	
    	model.addAttribute("fileVO1", fileVO1);
    	model.addAttribute("fileVO2", fileVO2);
    	model.addAttribute("fileVO3", fileVO3);
		return "web/pay/PayUserMsgDetailPopAjax";
	}
    
    /**
     * 사용내역 문자 상세보기 내용(카카오 추가) 
     * @param searchVO
     * @param model
     * @return	"/web/member/pay//selectPayUserMsgWithKakaoDetailDataAjax.do"
     * @throws Exception
     */
	@RequestMapping(value= {"/web/member/pay/selectPayUserMsgWithKakaoDetailDataAjax.do"})
	public String selectPayUserMsgWithKakaoDetailDataAjax(@ModelAttribute("searchVO") MjonMsgVO mjonMsgVO, ModelMap model) throws Exception{
		
		//로그인 권한정보 불러오기
    	LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
    	String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
    	
    	mjonMsgVO.setUserId(userId);
    	
    	//문자 상세보기 처리
    	MjonMsgVO resultMsgDetail = mjonMsgDataService.selectPayUserMsgDetailDataAjax(mjonMsgVO);
    	model.addAttribute("resultMsgDetail", resultMsgDetail);
    	
    	//문자 상세보기 이미지 아이디 받아오기 
    	String atchFileId1 ="";
    	String atchFileId2 ="";
    	String atchFileId3 ="";
    	
    	String path1 = resultMsgDetail.getFilePath1();
    	String path2 = resultMsgDetail.getFilePath2();
    	String path3 = resultMsgDetail.getFilePath3();
    	
    	FileVO fileVO1 = new FileVO();
    	FileVO fileVO2 = new FileVO();
    	FileVO fileVO3 = new FileVO();
    	
    	if(StringUtil.isNotEmpty(path1)) {
    		
    		//파일경로 및 이름을 이용하여 atchFileId, fileExtsn 번호 받아오기
    		fileVO1 = getFilePathToAtchFileId(path1);
    		
    	}
    	
    	if(StringUtil.isNotEmpty(path2)) {
    		
    		//파일경로 및 이름을 이용하여 atchFileId, fileExtsn 번호 받아오기
    		fileVO2 = getFilePathToAtchFileId(path2);
    		
    	}
    	

		if(StringUtil.isNotEmpty(path3)) {
			
			//파일경로 및 이름을 이용하여 atchFileId, fileExtsn 번호 받아오기
			fileVO3 = getFilePathToAtchFileId(path3);
			
		}
    	
    	model.addAttribute("fileVO1", fileVO1);
    	model.addAttribute("fileVO2", fileVO2);
    	model.addAttribute("fileVO3", fileVO3);
		return "web/pay/PayUserMsgWithKakaoDetailPopAjax";
	}
	
	//파일 이름을 이용하여 첨부파일 아이디(atchFileId), 첨부파일 순번(fileExtsn)을 찾는 함수
	public FileVO getFilePathToAtchFileId(String filePath) throws Exception{
		
		//마지막 / 의 인덱스 값 +1을 기준으로 문자열을 짤라줌
		String strFilePath = filePath.substring(filePath.lastIndexOf("/")+1);
		
		FileVO returnFileVO = new FileVO();
		
		//파일 이름과 확장자를 분리해줌
		String[] arrFileNm = strFilePath.split("\\.");
		String fileNm = arrFileNm[0];
		String fileExtsn = arrFileNm[1];
		
		FileVO fileVO = new FileVO();
		fileVO.setStreFileNm(fileNm);
		fileVO.setFileExtsn(fileExtsn);
		returnFileVO = mjonReservMsgService.selectFileNmToAtchFileIdInfo(fileVO);
    			
		return returnFileVO;
		
	}
    
    
    /**
	 * 요금사용내역
	 * @param mjonMsgVO
	 * @param model
	 * @return	"/web/member/pay/simpRecipAjax.do"
	 * @throws Exception
	 */
    @RequestMapping(value= {"/web/member/pay/simpRecipAjax.do"})
	public String simpRecipAjax(MjonPayVO mjonPayVO,
			HttpServletRequest request,
			ModelMap model) throws Exception{
		
		LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
		mjonPayVO.setUserId(userId);
		mjonPayVO.setBuyerName(loginVO.getName());
		
		System.out.println(mjonPayVO.getMoid());
		System.out.println(mjonPayVO.getTid());
		
		MjonPayVO resultPayVO = mjonPayService.selectPayVO(mjonPayVO);
		
		TaxVO taxVO = new TaxVO();
		
		//간이영수증은 해당 팝업 호출 시 바로 완료처리함
		taxVO.setMoid(mjonPayVO.getMoid());
		taxVO.setRcptType("0"); // 발행유형-[PG결제-현금영수증 유형과 동일] 1:소득공제, 2:지출증빙, 3:의무발행, 9:세금계산서, 0:간이영수증
		taxVO.setConfirmYn("Y");
		taxVO.setFrstRegisterId(userId);
		
		taxService.insertCashBill(taxVO);

		Calendar cal = Calendar.getInstance();
		
		int year = cal.get(Calendar.YEAR);
		int month = cal.get(Calendar.MONTH) + 1;
		int day = cal.get(Calendar.DAY_OF_MONTH);
		
		model.addAttribute("resultPayVO", resultPayVO);
		model.addAttribute("year", year);
		model.addAttribute("month", month);
		model.addAttribute("day", day);
		
		return "/web/pay/PaySimpRecipAjax";
	}
    /**
  	 * 요금 사용내역 엑셀 다운
  	 * @param mjonMsgVO
  	 * @param model
  	 * @return	"/web/member/pay/PayUserListAjax.do"
  	 * @throws Exception
  	 */
	@RequestMapping(value= {"/web/member/pay/PayUserListExcelDownload.do"})
	public void PayUserListExcelDownload(@ModelAttribute("searchVO") MjonMsgVO mjonMsgVO,
			HttpServletRequest request,
			HttpServletResponse response ,
			ModelMap model) throws Exception{
		
		// 메모리에 100개의 행을 유지합니다. 행의 수가 넘으면 디스크에 적습니다.
		SXSSFWorkbook wb = new SXSSFWorkbook(100);
		String fileName ="사용내역 엑셀 리스트";		// 저장 파일명
		String sheetTitle = "요금사용내역" ; 		// 셀 제목
		Sheet sheet = wb.createSheet(sheetTitle);
		Cell cell = null;
		Row row = null;
		
		CellStyle style = wb.createCellStyle();
		style.setBorderBottom(CellStyle.BORDER_THIN); //테두리 두껍게 
		style.setBorderLeft(CellStyle.BORDER_THIN);
		style.setBorderRight(CellStyle.BORDER_THIN);
		style.setBorderTop(CellStyle.BORDER_THIN);
		
		// 정렬
		style.setAlignment(CellStyle.ALIGN_CENTER); //가운데 정렬
		style.setVerticalAlignment(CellStyle.VERTICAL_CENTER); //높이 가운데 정렬
		
		Font font = wb.createFont();
		font.setBoldweight(Font.BOLDWEIGHT_BOLD);  //글씨 bold
		
		sheet.setColumnWidth(1, 5000); // 칼럼의 폭 조절
		sheet.setColumnWidth(4, 10000); // 칼럼의 폭 조절

		try{ 
			
			LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
			String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
			mjonMsgVO.setUserId(userId);
			
			mjonMsgVO.setRecordCountPerPage(100000);
			mjonMsgVO.setFirstIndex(0);
			
			if("".equals(mjonMsgVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
				mjonMsgVO.setSearchSortCnd("regDate");
				mjonMsgVO.setSearchSortOrd("desc");
			}
			
			List<MjonMsgVO> payUserList =  mjonMsgDataService.selectPayUserList(mjonMsgVO);
			{//화면 리스트
				
  				row = sheet.createRow(0);
  				
  				sheet.addMergedRegion(new CellRangeAddress(0,1,0,0)); //셀병합
  				sheet.addMergedRegion(new CellRangeAddress(0,1,1,1)); //셀병합
  				sheet.addMergedRegion(new CellRangeAddress(0,1,2,2)); //셀병합
  				sheet.addMergedRegion(new CellRangeAddress(0,1,3,3)); //셀병합
  				
  				
  				cell = row.createCell(0);
				cell.setCellValue("번호");
				cell.setCellStyle(style);
				
				cell = row.createCell(1);
				cell.setCellValue("날짜");
				cell.setCellStyle(style);
				
				cell = row.createCell(2);
				cell.setCellValue("문자유형");
				cell.setCellStyle(style);
				
				cell = row.createCell(3);
				cell.setCellValue("발송건수");
				cell.setCellStyle(style);
				
				cell = row.createCell(4);
				cell.setCellValue("내용");
				cell.setCellStyle(style);
				
				cell = row.createCell(5);
				cell.setCellValue("충전");
				sheet.addMergedRegion(new CellRangeAddress(0,0,5,6)); //셀병합
				cell.setCellStyle(style);
				
				cell = row.createCell(6);
				cell.setCellStyle(style);
				
				cell = row.createCell(7);
				cell.setCellValue("사용");
				sheet.addMergedRegion(new CellRangeAddress(0,0,7,8)); //셀병합
				cell.setCellStyle(style);
				
				cell = row.createCell(8);
				cell.setCellStyle(style);
				
				
				cell = row.createCell(9);
				cell.setCellValue("잔액");
				sheet.addMergedRegion(new CellRangeAddress(0,0,9,10)); //셀병합
				cell.setCellStyle(style);
				
				cell = row.createCell(10);
				cell.setCellStyle(style);
				
				row = sheet.createRow(1);
				
				cell = row.createCell(0);
				cell.setCellStyle(style);
				
				cell = row.createCell(1);
				cell.setCellStyle(style);
				
				cell = row.createCell(2);
				cell.setCellStyle(style);
				
				cell = row.createCell(3);
				cell.setCellStyle(style);
				
				cell = row.createCell(4);
				cell.setCellStyle(style);
				
				cell = row.createCell(5);
				cell.setCellValue("충전금");
				cell.setCellStyle(style);
				
				cell = row.createCell(6);
				cell.setCellValue("포인트");
				cell.setCellStyle(style);
				
				cell = row.createCell(7);
				cell.setCellValue("충전금");
				cell.setCellStyle(style);
				
				cell = row.createCell(8);
				cell.setCellValue("포인트");
				cell.setCellStyle(style);
				
				cell = row.createCell(9);
				cell.setCellValue("충전금");
				cell.setCellStyle(style);
				
				cell = row.createCell(10);
				cell.setCellValue("포인트");
				cell.setCellStyle(style);
				
				DecimalFormat formatter = new DecimalFormat("###,###.##");
				String befCash = "";
				String befPoint = "";
				String totPrice = "";
				String thisPoint = "";
				
				for(int i=0; i < payUserList.size(); i++) {
					
					befCash = formatter.format(Double.parseDouble(((MjonMsgVO)payUserList.get(i)).getBefCash()));
					befPoint = formatter.format(Double.parseDouble(((MjonMsgVO)payUserList.get(i)).getBefPoint()));
					totPrice = formatter.format(Double.parseDouble(((MjonMsgVO)payUserList.get(i)).getTotPrice()));
					thisPoint = formatter.format(Double.parseDouble(((MjonMsgVO)payUserList.get(i)).getThisPoint()));
					
					String msgType = "단문";
					if(payUserList.get(i).getMsgTypeTxt().equals("6") && payUserList.get(i).getFileCnt().equals("0")) {
						msgType = "장문";
					}else if(payUserList.get(i).getMsgTypeTxt().equals("6") && !payUserList.get(i).getFileCnt().equals("0")) {
						msgType = "그림";
					}else if(payUserList.get(i).getMsgTypeTxt().equals("8")) {
						msgType = "알림톡";
					}else if(payUserList.get(i).getMsgTypeTxt().equals("9")) {
						msgType = "친구톡";
					}else if(payUserList.get(i).getMsgTypeTxt().equals("fax")) {
						msgType = "팩스";
					}
					
					int sendCount = ((MjonMsgVO)payUserList.get(i)).getSendCount();
					
					
					String sendSum = Integer.toString(sendCount);
					
					if(payUserList.get(i).getMsgTypeTxt().equals("fax")) {
						sendSum = sendSum+"("+payUserList.get(i).getFileCnt()+")";
					}
					
					row = sheet.createRow(i+2);
					for(int j=0 ; j <= sendPayUserExcelValue.length ; j++) {
						cell = row.createCell(j);
						cell.setCellStyle(style);
						if(j==0) cell.setCellValue(i+1); //번호
						if(j==1) cell.setCellValue(((MjonMsgVO)payUserList.get(i)).getRegDate()); 		//결제일시
						if(j==2) cell.setCellValue(msgType); 											//문자유형
						if(j==3) cell.setCellValue(((MjonMsgVO)payUserList.get(i)).getSendCount()); 	//발송건수
						if(j==4) cell.setCellValue(((MjonMsgVO)payUserList.get(i)).getSmsTxt()); 		//내용
						if(j==5) cell.setCellValue(befCash); 		//충전 - 충전금
						if(j==6) cell.setCellValue(befPoint); 		//충전 - 포인트
						if(j==7) cell.setCellValue(totPrice); 		//사용 - 충전금
						if(j==8) cell.setCellValue(0);													//사용 - 포인트
						if(j==9) cell.setCellValue(thisPoint); 	//잔액 - 충전금
						if(j==10) cell.setCellValue(befPoint); 	//잔액 - 포인트
  					}
				}
			}
			response.setHeader("Set-Cookie", "fileDownload=true; path=/");
			SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat ( "yyyy_MM_dd_HH_mm_ss", Locale.KOREA );
			Date currentTime = new Date ();
			String mTime = mSimpleDateFormat.format ( currentTime );
			fileName = fileName+"("+mTime+")";
			
			response.setHeader("Content-Disposition", String.format("attachment; filename=\""+new String((fileName).getBytes("KSC5601"),"8859_1")+".xlsx"));
			wb.write(response.getOutputStream());
		}catch(Exception e) {
  			response.setHeader("Set-Cookie", "fileDownload=false; path=/");
  			response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
  			response.setHeader("Content-Type","text/html; charset=utf-8");
  			OutputStream out = null;
  			try {
  				out = response.getOutputStream();
  				byte[] data = new String("fail..").getBytes();
  				out.write(data, 0, data.length);
  			} catch(Exception ignore) {
  				ignore.printStackTrace();
  			} finally {
  				if(out != null) try { out.close(); } catch(Exception ignore) {}
  			}
  		}finally {
  			// 디스크 적었던 임시파일을 제거합니다.
  			wb.dispose();
  			try { wb.close(); } catch(Exception ignore) {}
  		}
	}
	
	/**
	 * 요금 사용내역 엑셀 다운 카카오 추가
	 * @param mjonMsgVO
	 * @param model
	 * @return	"/web/member/pay/PayUserWithKakaoListExcelDownload.do"
	 * @throws Exception
	 */
	@RequestMapping(value= {"/web/member/pay/PayUserWithKakaoListExcelDownload.do"})
	public void PayUserWithKakaoListExcelDownload(@ModelAttribute("searchVO") MjonMsgVO mjonMsgVO,
			HttpServletRequest request,
			HttpServletResponse response ,
			ModelMap model) throws Exception{
		
		// 메모리에 100개의 행을 유지합니다. 행의 수가 넘으면 디스크에 적습니다.
		SXSSFWorkbook wb = new SXSSFWorkbook(100);
		String fileName ="사용내역 엑셀 리스트";		// 저장 파일명
		String sheetTitle = "요금사용내역" ; 		// 셀 제목
		Sheet sheet = wb.createSheet(sheetTitle);
		Cell cell = null;
		Row row = null;
		
		CellStyle style = wb.createCellStyle();
		style.setBorderBottom(CellStyle.BORDER_THIN); //테두리 두껍게 
		style.setBorderLeft(CellStyle.BORDER_THIN);
		style.setBorderRight(CellStyle.BORDER_THIN);
		style.setBorderTop(CellStyle.BORDER_THIN);
		
		// 정렬
		style.setAlignment(CellStyle.ALIGN_CENTER); //가운데 정렬
		style.setVerticalAlignment(CellStyle.VERTICAL_CENTER); //높이 가운데 정렬
		
		Font font = wb.createFont();
		font.setBoldweight(Font.BOLDWEIGHT_BOLD);  //글씨 bold
		
		sheet.setColumnWidth(1, 5000); // 칼럼의 폭 조절
		sheet.setColumnWidth(4, 10000); // 칼럼의 폭 조절
		
		try{ 
			
			LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
			String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
			mjonMsgVO.setUserId(userId);
			
			mjonMsgVO.setRecordCountPerPage(100000);
			mjonMsgVO.setFirstIndex(0);
			
			if("".equals(mjonMsgVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
				mjonMsgVO.setSearchSortCnd("regDate");
				mjonMsgVO.setSearchSortOrd("desc");
			}
			
			List<MjonMsgVO> payUserList =  mjonMsgDataService.selectPayUserWithKakaoList(mjonMsgVO);
			{//화면 리스트
				
				row = sheet.createRow(0);
				
				sheet.addMergedRegion(new CellRangeAddress(0,1,0,0)); //셀병합
				sheet.addMergedRegion(new CellRangeAddress(0,1,1,1)); //셀병합
				sheet.addMergedRegion(new CellRangeAddress(0,1,2,2)); //셀병합
				sheet.addMergedRegion(new CellRangeAddress(0,1,3,3)); //셀병합
				
				
				cell = row.createCell(0);
				cell.setCellValue("번호");
				cell.setCellStyle(style);
				
				cell = row.createCell(1);
				cell.setCellValue("날짜");
				cell.setCellStyle(style);
				
				cell = row.createCell(2);
				cell.setCellValue("문자유형");
				cell.setCellStyle(style);
				
				cell = row.createCell(3);
				cell.setCellValue("발송건수");
				cell.setCellStyle(style);
				
				cell = row.createCell(4);
				cell.setCellValue("내용");
				cell.setCellStyle(style);
				
				cell = row.createCell(5);
				cell.setCellValue("충전");
				sheet.addMergedRegion(new CellRangeAddress(0,0,5,6)); //셀병합
				cell.setCellStyle(style);
				
				cell = row.createCell(6);
				cell.setCellStyle(style);
				
				cell = row.createCell(7);
				cell.setCellValue("사용");
				sheet.addMergedRegion(new CellRangeAddress(0,0,7,8)); //셀병합
				cell.setCellStyle(style);
				
				cell = row.createCell(8);
				cell.setCellStyle(style);
				
				
				cell = row.createCell(9);
				cell.setCellValue("잔액");
				sheet.addMergedRegion(new CellRangeAddress(0,0,9,10)); //셀병합
				cell.setCellStyle(style);
				
				cell = row.createCell(10);
				cell.setCellStyle(style);
				
				row = sheet.createRow(1);
				
				cell = row.createCell(0);
				cell.setCellStyle(style);
				
				cell = row.createCell(1);
				cell.setCellStyle(style);
				
				cell = row.createCell(2);
				cell.setCellStyle(style);
				
				cell = row.createCell(3);
				cell.setCellStyle(style);
				
				cell = row.createCell(4);
				cell.setCellStyle(style);
				
				cell = row.createCell(5);
				cell.setCellValue("충전금");
				cell.setCellStyle(style);
				
				cell = row.createCell(6);
				cell.setCellValue("포인트");
				cell.setCellStyle(style);
				
				cell = row.createCell(7);
				cell.setCellValue("충전금");
				cell.setCellStyle(style);
				
				cell = row.createCell(8);
				cell.setCellValue("포인트");
				cell.setCellStyle(style);
				
				cell = row.createCell(9);
				cell.setCellValue("충전금");
				cell.setCellStyle(style);
				
				cell = row.createCell(10);
				cell.setCellValue("포인트");
				cell.setCellStyle(style);
				
				DecimalFormat formatter = new DecimalFormat("###,###.##");
				String befCash = "";
				String befPoint = "";
				String totPrice = "";
				String thisPoint = "";
				
				for(int i=0; i < payUserList.size(); i++) {
					
					befCash = formatter.format(Double.parseDouble(((MjonMsgVO)payUserList.get(i)).getBefCash()));
					//카카오 테스트 데이터들에 beforPoint가 null이라 임시로 null체크 처리
					if(payUserList.get(i).getBefPoint() != null){
						befPoint = formatter.format(Double.parseDouble(((MjonMsgVO)payUserList.get(i)).getBefPoint()));
					}
					totPrice = formatter.format(Double.parseDouble(((MjonMsgVO)payUserList.get(i)).getTotPrice()));
					thisPoint = formatter.format(Double.parseDouble(((MjonMsgVO)payUserList.get(i)).getThisPoint()));
					
					String msgType = "단문";
					if(payUserList.get(i).getMsgTypeTxt().equals("6") && payUserList.get(i).getFileCnt().equals("0")) {
						msgType = "장문";
					}else if(payUserList.get(i).getMsgTypeTxt().equals("6") && !payUserList.get(i).getFileCnt().equals("0")) {
						msgType = "그림";
					}else if(payUserList.get(i).getMsgTypeTxt().equals("8")) {
						msgType = "알림톡";
					}else if(payUserList.get(i).getMsgTypeTxt().equals("9")) {
						msgType = "친구톡";
					}else if(payUserList.get(i).getMsgTypeTxt().equals("fax")) {
						msgType = "팩스";
					}
					
					int sendCount = ((MjonMsgVO)payUserList.get(i)).getSendCount();
					
					
					String sendSum = Integer.toString(sendCount);

					if(payUserList.get(i).getMsgTypeTxt().equals("fax")) {
						sendSum = sendSum+"("+payUserList.get(i).getFileCnt()+")";
					}
					
					row = sheet.createRow(i+2);
					for(int j=0 ; j < sendPayUserExcelValue.length ; j++) {
						cell = row.createCell(j);
						cell.setCellStyle(style);
						if(j==0) cell.setCellValue(i+1); //번호
						if(j==1) cell.setCellValue(((MjonMsgVO)payUserList.get(i)).getRegDate()); 		//결제일시
						if(j==2) cell.setCellValue(msgType); 											//문자유형
						if(j==3) cell.setCellValue(sendSum); 	//발송건수
						if(j==4) cell.setCellValue(((MjonMsgVO)payUserList.get(i)).getSmsTxt()); 		//내용
						if(j==5) cell.setCellValue(befCash); 		//충전 - 충전금
						if(j==6) cell.setCellValue(befPoint); 		//충전 - 포인트
						if(j==7) cell.setCellValue(totPrice); 		//사용 - 충전금
						if(j==8) cell.setCellValue(0);													//사용 - 포인트
						if(j==9) cell.setCellValue(thisPoint); 	//잔액 - 충전금
						if(j==10) cell.setCellValue(befPoint); 	//잔액 - 포인트
					}
				}
			}
			response.setHeader("Set-Cookie", "fileDownload=true; path=/");
			SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat ( "yyyy_MM_dd_HH_mm_ss", Locale.KOREA );
			Date currentTime = new Date ();
			String mTime = mSimpleDateFormat.format ( currentTime );
			fileName = fileName+"("+mTime+")";
			
			response.setHeader("Content-Disposition", String.format("attachment; filename=\""+new String((fileName).getBytes("KSC5601"),"8859_1")+".xlsx"));
			wb.write(response.getOutputStream());
		}catch(Exception e) {
			response.setHeader("Set-Cookie", "fileDownload=false; path=/");
			response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
			response.setHeader("Content-Type","text/html; charset=utf-8");
			OutputStream out = null;
			try {
				out = response.getOutputStream();
				byte[] data = new String("fail..").getBytes();
				out.write(data, 0, data.length);
			} catch(Exception ignore) {
				ignore.printStackTrace();
			} finally {
				if(out != null) try { out.close(); } catch(Exception ignore) {}
			}
		}finally {
			// 디스크 적었던 임시파일을 제거합니다.
			wb.dispose();
			try { wb.close(); } catch(Exception ignore) {}
		}
	}



    /**
     * 계산서/현금영수증 발행 등록
     * @param searchVO
     * @param model
     * @return	"/web/pay/PayView.do"
     * @throws Exception
     */
    @RequestMapping(value= {"/web/member/pay/BillPub.do"})
	public String BillPub(@ModelAttribute("searchVO") MjonPayVO mjonPayVO,  @RequestParam(required = false) String billType,
			HttpServletRequest request, RedirectAttributes redirectAttributes,
			ModelMap model) throws Exception{
    	
    		/*LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();*/
			LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
			
			if(loginVO == null) {
				//redirectAttributes.addFlashAttribute("message", "문자온 서비스는 로그인 후 이용 가능합니다.");
				return "redirect:/web/user/login/login.do";
			}
    		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
    	
			// 이메일 코드조회
			ComDefaultCodeVO voComCode = new ComDefaultCodeVO();
			voComCode.setCodeId("ITN031");
			model.addAttribute("emailCode", cmmUseService.selectCmmCodeDetail(voComCode));
    		
    		MberManageVO mberManageVO = mberManageService.selectMber(userId);
    		//결제내역에서 왔을 시 세금계산서/현금영수증 수정 화면 맞게 뿌려주기
    		mberManageVO.setBillType(billType);
        	MjonCandidateVO mjonCandidateVO = new MjonCandidateVO();
        	if("p".equals(mberManageVO.getDept())) { //개인회원 선거 후보자 정보 불러오기
        		mjonCandidateVO = mjonCandidateService.selectCandidateDataInfo(userId);
        		if(mjonCandidateVO != null) {
        			mjonCandidateVO.setRegidentNo1(egovCryptoUtil.decrypt(mjonCandidateVO.getRegidentNo1()));
        			mjonCandidateVO.setRegidentNo2(egovCryptoUtil.decrypt(mjonCandidateVO.getRegidentNo2()));
        		}
        	}
        	model.addAttribute("mberManageVO", mberManageVO);
        	model.addAttribute("mjonCandidateVO", mjonCandidateVO);
		return "/web/pay/BillPub";
	}
    
    /**
     * 계산서/현금영수증 자동발행 select - 세금계산서 자동 발행 일 시 현금영수증 탭 이동 막기, 현금영수증 자동 발행 시 세금계산서 탭 이동 막기
     * @param searchVO
     * @param model
     * @return	"/web/pay/PayView.do"
     * @throws Exception
     */
    @RequestMapping(value= {"/web/member/pay/billSelectAjax.do"})
	public ModelAndView billSelectAjax(@ModelAttribute("searchVO") MjonPayVO mjonPayVO, 
			HttpServletRequest request,
			ModelMap model) throws Exception{
    	
    		ModelAndView modelAndView = new ModelAndView();
    		modelAndView.setViewName("jsonView");
    		
    		LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
    		MberManageVO mberManageVO = mberManageService.selectMber(loginVO.getId());
    		
    		//개인회원일 시 선거후보자 주민등록번호 체크 후 후보자 미등록시 세금계산서 발행 막기
    		MjonCandidateVO mjonCandidateVO = new MjonCandidateVO();
    		String regidentNo = "";
    		if("p".equals(mberManageVO.getDept())) {
    		mjonCandidateVO = mjonCandidateService.selectCandidateDataInfo(mberManageVO.getMberId());
    			if(mjonCandidateVO != null) {
    				regidentNo = mjonCandidateVO.getRegidentNo1() + mjonCandidateVO.getRegidentNo2();
    			}
    		}
    		
    		modelAndView.addObject("dept", mberManageVO.getDept());
    		modelAndView.addObject("regidentNo", regidentNo);
    		modelAndView.addObject("taxbillAutoYN", mberManageVO.getTaxbillAuto());
    		modelAndView.addObject("cashbillAutoYN", mberManageVO.getCashbillAuto());
    		
    		return modelAndView;
	}    
    
    /**
     * 계산서 발행 수정
     * @param searchVO
     * @param model
     * @return	"/web/pay/PayView.do"
     * @throws Exception
     */
    @RequestMapping(value= {"/web/member/pay/updateTaxbill.do"})
	public String updateTaxbill(@ModelAttribute("searchVO") MjonPayVO mjonPayVO,
			@ModelAttribute("mberManageVO") MberManageVO mberManageVO,  HttpServletRequest request,
			ModelMap model, RedirectAttributes redirectAttributes) throws Exception{
    	
    	//230801 이지우 추가 - 세금계산서 발행 시 아이디 변조하여 다른 계정의 세금계산서 정보 수정하는 취약점 대응 조치
		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getUniqId());
		
    	mberManageVO.setUniqId(userId);
    	mberManageService.updateTaxbill(mberManageVO);
    	
    	redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.update"));
    	
    	return "redirect:/web/member/pay/BillPub.do";
	}
    /**
     * 현금영수증 발행 수정
     * @param searchVO
     * @param model
     * @return	"/web/pay/PayView.do"
     * @throws Exception
     */    
    @RequestMapping(value= {"/web/member/pay/updateCashbill.do"})
	public String updateCashbill(@ModelAttribute("searchVO") MjonPayVO mjonPayVO,
			@ModelAttribute("mberManageVO") MberManageVO mberManageVO,  HttpServletRequest request,
			ModelMap model, RedirectAttributes redirectAttributes) throws Exception{
    	
    	mberManageService.updateCashbill(mberManageVO);
    	
    	redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.update"));
    	
    	return "redirect:/web/member/pay/BillPub.do";
	}
    
    //결제 엑셀 다운로드 
    @RequestMapping(value= {"/web/member/pay/PayExcelDownload.do"})
  	public void PayExcelDownload( MjonPayVO mjonPayVO, 
			HttpServletRequest request,
			HttpServletResponse response ,
			ModelMap model) throws Exception {
  		
    	mjonPayVO.setRecordCountPerPage(100000);
    	mjonPayVO.setFirstIndex(0);
  		LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
		
  		// 메모리에 100개의 행을 유지합니다. 행의 수가 넘으면 디스크에 적습니다.
  		SXSSFWorkbook wb = new SXSSFWorkbook(100);
  		CellStyle style = wb.createCellStyle();
  		style.setBorderBottom(CellStyle.BORDER_THIN); //테두리 두껍게 
   		style.setBorderLeft(CellStyle.BORDER_THIN);
   		style.setBorderRight(CellStyle.BORDER_THIN);
   		style.setBorderTop(CellStyle.BORDER_THIN);
   		Font font = wb.createFont();
   		font.setBoldweight(Font.BOLDWEIGHT_BOLD);  //글씨 bold
   		
  		Cell cell = null;
  		Row row = null;
  		
  		String fileName ="결제내역 엑셀 리스트";
  		
  		String sheetTitle = ""; 
  		try{
  			if("".equals(mjonPayVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
    			mjonPayVO.setSearchSortCnd("moid");
    			mjonPayVO.setSearchSortOrd("desc");
    		}
  			if(!"".equals(mjonPayVO.getPayMethod())){
  				mjonPayVO.setSearchCondition2(mjonPayVO.getPayMethod());
  			}
  			
  			// JSPark 2022.03.16 => 뷰 목록과 데이터 상이
        	String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
        	mjonPayVO.setUserId(userId);
        	
  			List<MjonPayVO> resultList = mjonPayService.selectPayList(mjonPayVO);
  			{ //화면 리스트
  				sheetTitle = "요금결제내역" ; //제목
  				Sheet sheet = wb.createSheet(sheetTitle);
  				row = sheet.createRow(0);
  		        for(int i=0 ; i < sendPayExcelValue.length ; i++) {
  	 		       cell = row.createCell(i);
  	 		       cell.setCellStyle(style);
  		 	       cell.setCellValue(sendPayExcelValue[i][1]);
  	 		    }
  			    
  		        for(int i=0; i <  resultList.size(); i++){
  			    	row = sheet.createRow(i+1);
  			    	for(int j=0 ; j < sendPayExcelValue.length ; j++) {
  			        	cell = row.createCell(j);
  			        	cell.setCellStyle(style);
  			        	if(j==0) cell.setCellValue(i+1); //번호
  			        	if(j==1) cell.setCellValue(((MjonPayVO)resultList.get(i)).getRegDate()); //결제일시
  			        	if(j==2) cell.setCellValue(((MjonPayVO)resultList.get(i)).getPayMethodTxt()); //결제방식
  			        	if(j==3) cell.setCellValue(((MjonPayVO)resultList.get(i)).getAmt()); //결제금액(부과세포함)
  			        	if(j==4) cell.setCellValue(((MjonPayVO)resultList.get(i)).getPgStatusTxt()); //결제상태
  			        	if(j==5) cell.setCellValue(((MjonPayVO)resultList.get(i)).getTid()); //결제정보
  			        	if(j==6) cell.setCellValue(((MjonPayVO)resultList.get(i)).getRcptTypeTxt()); //증빙서류 발행요청
  				 	}
  		        }
  			}
  	    response.setHeader("Set-Cookie", "fileDownload=true; path=/");
  		SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat ( "yyyy_MM_dd_HH_mm_ss", Locale.KOREA );
  		Date currentTime = new Date ();
  		String mTime = mSimpleDateFormat.format ( currentTime );
  		fileName = fileName+"("+mTime+")";
  		
  		response.setHeader("Content-Disposition", String.format("attachment; filename=\""+new String((fileName).getBytes("KSC5601"),"8859_1")+".xlsx"));
  		wb.write(response.getOutputStream());
  	    
  		}catch(Exception e) {
  			response.setHeader("Set-Cookie", "fileDownload=false; path=/");
  			response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
  			response.setHeader("Content-Type","text/html; charset=utf-8");
  			OutputStream out = null;
  			try {
  				out = response.getOutputStream();
  				byte[] data = new String("fail..").getBytes();
  				out.write(data, 0, data.length);
  			} catch(Exception ignore) {
  				ignore.printStackTrace();
  			} finally {
  				if(out != null) try { out.close(); } catch(Exception ignore) {}
  			}
  		}finally {
  			// 디스크 적었던 임시파일을 제거합니다.
  			wb.dispose();
  			try { wb.close(); } catch(Exception ignore) {}
  		}
  	}
    
    
    //포인트 교환내역 엑셀 다운로드 
    @RequestMapping(value= {"/web/member/pay/PointExcelDownload.do"})
  	public void PointExcelDownload( MjonPayVO mjonPayVO, 
			HttpServletRequest request,
			HttpServletResponse response ,
			ModelMap model) throws Exception {
  		
    	mjonPayVO.setRecordCountPerPage(100000);
    	mjonPayVO.setFirstIndex(0);
  		LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
		
  		// 메모리에 100개의 행을 유지합니다. 행의 수가 넘으면 디스크에 적습니다.
  		SXSSFWorkbook wb = new SXSSFWorkbook(100);
  		CellStyle style = wb.createCellStyle();
  		style.setBorderBottom(CellStyle.BORDER_THIN); //테두리 두껍게 
   		style.setBorderLeft(CellStyle.BORDER_THIN);
   		style.setBorderRight(CellStyle.BORDER_THIN);
   		style.setBorderTop(CellStyle.BORDER_THIN);
   		Font font = wb.createFont();
   		font.setBoldweight(Font.BOLDWEIGHT_BOLD);  //글씨 bold
   		
  		Cell cell = null;
  		Row row = null;
  		
  		String fileName ="포인트 교환내역 엑셀 리스트";
  		
  		String sheetTitle = ""; 
  		try{
  			if("".equals(mjonPayVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
    			mjonPayVO.setSearchSortCnd("pointUseId");
    			mjonPayVO.setSearchSortOrd("desc");
    		}
  			
  			// JSPark 2022.03.16 => 뷰 목록과 데이터 상이
        	String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
        	mjonPayVO.setUserId(userId);
        	mjonPayVO.setType("1"); 	// 현금
        	
        	List<MjonPayVO> resultList = mjonPayService.selectPointUseList(mjonPayVO);
  			{ //화면 리스트
  				sheetTitle = "포인트 교환내역" ; //제목
  				Sheet sheet = wb.createSheet(sheetTitle);
  				row = sheet.createRow(0);
  		        for(int i=0 ; i < sendPointUseExcelValue.length ; i++) {
  	 		       cell = row.createCell(i);
  	 		       cell.setCellStyle(style);
  		 	       cell.setCellValue(sendPointUseExcelValue[i][1]);
  	 		    }
  			    
  		        for(int i=0; i <  resultList.size(); i++){
  			    	row = sheet.createRow(i+1);
  			    	for(int j=0 ; j < sendPointUseExcelValue.length ; j++) {
  			        	cell = row.createCell(j);
  			        	cell.setCellStyle(style);
  			        	if(j==0) cell.setCellValue(i+1); //번호
  			        	if(j==1) cell.setCellValue(((MjonPayVO)resultList.get(i)).getFrstRegistPnttm()); //교환일시
  			        	if(j==2) { //교환방식
  			        		String type = ((MjonPayVO)resultList.get(i)).getType();
  			        		if(type.equals("1")) {
  			        			cell.setCellValue("현금");
  			        		}else {
  			        			cell.setCellValue("캐쉬 전환");
  			        		}
  			        	} 
  			        	if(j==3) cell.setCellValue(((MjonPayVO)resultList.get(i)).getPoint()); //교환 포인트
  			        	if(j==4) { //교환상태
  			        		String cmpltYn = ((MjonPayVO)resultList.get(i)).getCmpltYn();
  			        		if(cmpltYn.equals("Y")) {
  			        			cell.setCellValue("전환 완료");
  			        		}else if(cmpltYn.equals("N")) {
  			        			cell.setCellValue("처리중");
  			        		}else {
  			        			cell.setCellValue("전환 불가");
  			        		}
  			        	} 
  			        	if(j==5) cell.setCellValue(((MjonPayVO)resultList.get(i)).getBankNm()); //은행
  			        	if(j==6) cell.setCellValue(((MjonPayVO)resultList.get(i)).getAccountNum()); //계좌번호
  			        	if(j==7) cell.setCellValue(((MjonPayVO)resultList.get(i)).getAccountNm()); //예금주
  			        	if(j==8) cell.setCellValue(((MjonPayVO)resultList.get(i)).getMbtlNum()); //연락처
  				 	}
  		        }
  			}
  	    response.setHeader("Set-Cookie", "fileDownload=true; path=/");
  		SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat ( "yyyy_MM_dd_HH_mm_ss", Locale.KOREA );
  		Date currentTime = new Date ();
  		String mTime = mSimpleDateFormat.format ( currentTime );
  		fileName = fileName+"("+mTime+")";
  		
  		response.setHeader("Content-Disposition", String.format("attachment; filename=\""+new String((fileName).getBytes("KSC5601"),"8859_1")+".xlsx"));
  		wb.write(response.getOutputStream());
  	    
  		}catch(Exception e) {
  			response.setHeader("Set-Cookie", "fileDownload=false; path=/");
  			response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
  			response.setHeader("Content-Type","text/html; charset=utf-8");
  			OutputStream out = null;
  			try {
  				out = response.getOutputStream();
  				byte[] data = new String("fail..").getBytes();
  				out.write(data, 0, data.length);
  			} catch(Exception ignore) {
  				ignore.printStackTrace();
  			} finally {
  				if(out != null) try { out.close(); } catch(Exception ignore) {}
  			}
  		}finally {
  			// 디스크 적었던 임시파일을 제거합니다.
  			wb.dispose();
  			try { wb.close(); } catch(Exception ignore) {}
  		}
  	}
    
    //환불 요청내역 엑셀 다운로드 
    @RequestMapping(value= {"/web/member/pay/refundExcelDownload.do"})
  	public void refundExcelDownload( MjonPayVO mjonPayVO, 
			HttpServletRequest request,
			HttpServletResponse response ,
			ModelMap model) throws Exception {
  		
  		// 메모리에 100개의 행을 유지합니다. 행의 수가 넘으면 디스크에 적습니다.
  		SXSSFWorkbook wb = new SXSSFWorkbook(100);
  		CellStyle style = wb.createCellStyle();
  		style.setBorderBottom(CellStyle.BORDER_THIN); //테두리 두껍게 
   		style.setBorderLeft(CellStyle.BORDER_THIN);
   		style.setBorderRight(CellStyle.BORDER_THIN);
   		style.setBorderTop(CellStyle.BORDER_THIN);
   		Font font = wb.createFont();
   		font.setBoldweight(Font.BOLDWEIGHT_BOLD);  //글씨 bold
   		
  		Cell cell = null;
  		Row row = null;
  		
  		String fileName ="환불 요청내역 엑셀 리스트";
  		String sheetTitle = ""; 
  		try{
  			
  			RefundVO refundVO = new RefundVO();
  			refundVO.setRecordCountPerPage(100000);
  			refundVO.setFirstIndex(0);
  	  		LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
  			
  			if("".equals(mjonPayVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
  				refundVO.setSearchSortCnd("refundId");
  				refundVO.setSearchSortOrd("desc");
    		}else {
    			//환불 요청 리스트 정보 셋팅하기
            	refundVO.setSearchSortCnd(mjonPayVO.getSearchSortCnd());
    			refundVO.setSearchSortOrd(mjonPayVO.getSearchSortOrd());
    		}
  			
  			// JSPark 2022.03.16 => 뷰 목록과 데이터 상이
        	String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
        	refundVO.setMberId(userId);
        	
        	String refundListType = mjonPayVO.getRefundListType();
        	
        	if(refundListType == null || refundListType.equals("")) {
        		mjonPayVO.setRefundListType("tab1");
        	}
        	
        	refundVO.setStartDate(mjonPayVO.getStartDate());
        	refundVO.setEndDate(mjonPayVO.getEndDate());
        	
        	List<RefundVO> resultList = refundService.selectRefundList(refundVO);
  			{ //화면 리스트
  				sheetTitle = "환불 요청내역" ; //제목
  				Sheet sheet = wb.createSheet(sheetTitle);
  				row = sheet.createRow(0);
  		        for(int i=0 ; i < refundExcelValue.length ; i++) {
  	 		       cell = row.createCell(i);
  	 		       cell.setCellStyle(style);
  		 	       cell.setCellValue(refundExcelValue[i][1]);
  	 		    }
  			    
  		        for(int i=0; i <  resultList.size(); i++){
  			    	row = sheet.createRow(i+1);
  			    	for(int j=0 ; j < refundExcelValue.length ; j++) {
  			        	cell = row.createCell(j);
  			        	cell.setCellStyle(style);
  			        	if(j==0) cell.setCellValue(i+1); //번호
  			        	if(j==1) cell.setCellValue(((RefundVO)resultList.get(i)).getFrstRegisterPnttm()); //환불요청일시
  			        	if(j==2) cell.setCellValue(((RefundVO)resultList.get(i)).getRefundHandlePnttm()); //환불처리일시
  			        	if(j==3) cell.setCellValue(((RefundVO)resultList.get(i)).getRefundMoney()); //환불요청금액
  			        	if(j==4) cell.setCellValue(((RefundVO)resultList.get(i)).getRefundCash()); //환불처리금액
  			        	if(j==5) { //교환상태
  			        		String refundStatus = ((RefundVO)resultList.get(i)).getRefundStatus();
  			        		if(refundStatus.equals("1")) {
  			        			cell.setCellValue("환불 요청");
  			        		}else if(refundStatus.equals("2")) {
  			        			cell.setCellValue("환불 처리중 ");
  			        		}else if(refundStatus.equals("3")) {
  			        			cell.setCellValue("환불 완료");
  			        		}else {
  			        			cell.setCellValue("환불 취소");
  			        		}
  			        	} 
  				 	}
  		        }
  			}
  	    response.setHeader("Set-Cookie", "fileDownload=true; path=/");
  		SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat ( "yyyy_MM_dd_HH_mm_ss", Locale.KOREA );
  		Date currentTime = new Date ();
  		String mTime = mSimpleDateFormat.format ( currentTime );
  		fileName = fileName+"("+mTime+")";
  		
  		response.setHeader("Content-Disposition", String.format("attachment; filename=\""+new String((fileName).getBytes("KSC5601"),"8859_1")+".xlsx"));
  		wb.write(response.getOutputStream());
  	    
  		}catch(Exception e) {
  			response.setHeader("Set-Cookie", "fileDownload=false; path=/");
  			response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
  			response.setHeader("Content-Type","text/html; charset=utf-8");
  			OutputStream out = null;
  			try {
  				out = response.getOutputStream();
  				byte[] data = new String("fail..").getBytes();
  				out.write(data, 0, data.length);
  			} catch(Exception ignore) {
  				ignore.printStackTrace();
  			} finally {
  				if(out != null) try { out.close(); } catch(Exception ignore) {}
  			}
  		}finally {
  			// 디스크 적었던 임시파일을 제거합니다.
  			wb.dispose();
  			try { wb.close(); } catch(Exception ignore) {}
  		}
  	}
    
    
    /**
     * 결제 Action 페이지 
     * @param searchVO
     * @param model
     * @return	"/web/pay/PayView.do"
     * @throws Exception
     */
    @RequestMapping(value= {"/web/member/pay/PayActionAjax.do"})
	public String PayAction(@ModelAttribute("mjonPayVO") MjonPayVO mjonPayVO, 
			HttpServletRequest request,
			ModelMap model) throws Exception{
    	
    	String pattern = (String) request.getAttribute(
                HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE) ;
    	
    	mjonPayVO.setReturnURL(request.getRequestURL().toString().split("pay")[0] + "pay/payResultAjax.do") ;
    	LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
    	//테스트
    	mjonPayVO.setBuyerName(loginVO.getName());			//구매자 이름
    	mjonPayVO.setBuyerEmail(loginVO.getEmail());		//구매자 이메일
    	mjonPayVO.setBuyerTel(loginVO.getMoblphonNo());		//구매자 휴대폰 번호
    	//moid 생성 위치 변경
    	mjonPayVO.setMoid(idgenPgMoid.getNextStringId());				
    	
		model.addAttribute("mjonPayVO", mjonPayVO);
		return "web/cop/nicepay/payRequestMber";
		
	}
    
    /**
     * 포인트 전환 ajax
     * @param mjonPayVO
     * @param model
     * @throws Exception
     */
    @RequestMapping(value= "/web/member/pay/pointUseAjax.do")
    public ModelAndView pointUseAjax(@ModelAttribute("mjonPayVO") MjonPayVO mjonPayVO, 
    		HttpServletRequest request,
    		ModelMap model) throws Exception{
    	
    	LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
    	
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		
		mjonPayVO.setFrstRegisterId(user.getId());
		mjonPayVO.setUserId(user.getId());
		
		RefundVO refundVO = new RefundVO();
		refundVO.setMberId(user.getId());
		
		RefundVO mberInfoVO = refundService.selectRefundMberInfo(refundVO);
		
		//포인트 교환요청에서 포인트 정보가 음수(-)로 넘어오는 경우 처리를 위해 절대값 처리 해줌. - 20230824 우영두
		mjonPayVO.setPoint(Math.abs(mjonPayVO.getPoint()));
		
		if(Double.parseDouble(mberInfoVO.getMberPoint()) 
				< mjonPayVO.getPoint()) {
			
			modelAndView.addObject("status", "moreThanUserPoint");
			modelAndView.addObject("msg", "현재 회원의 보유포인트보다 큰 포인트를 환불 할 수 없습니다.");
			
			return modelAndView;
		}
		
		
		if("1".equals(mjonPayVO.getType())){ //현금전환 시
			mjonPayVO.setMemo("현금 "+mjonPayVO.getPoint()+" 전환"); //전환 내용
			mjonPayVO.setCmpltYn("N"); //현금 전환 시 처리 전
		}else { //잔액 전환 시
			mjonPayVO.setMemo("잔액 "+mjonPayVO.getPoint()+" 전환"); //전환 내용
			mjonPayVO.setCmpltYn("Y"); //잔액 전환 시 바로 처리
		}
		try {
			//impl에서 point use 테이블, point 테이블, cash 테이블, 회워테이블 insert 및 update 처리
			mjonPayService.insertPointUse(mjonPayVO);
			modelAndView.addObject("result", "success");
			
			// 법인폰 알람여부 체크
			JoinSettingVO joinSettingVO = new JoinSettingVO();
			joinSettingVO = egovSiteManagerService.selectAdminNotiDetail();
			// 이메일 체크
			if (joinSettingVO != null && joinSettingVO.getEmailNoti().equals("Y")) {
				String emailTitle = "결제관리 > 포인트 현금 전환 요청";
				// CS관리자 이메일 알림전송
				mjonNoticeSendUtil.csAdminEmailNoticeSend(user.getName(), user.getId(), emailTitle);
			}			
			
			// SLACK 체크
			if (joinSettingVO != null && joinSettingVO.getSlackNoti().equals("Y")) {			
				// Slack 메시지 발송(단순본문)
				String msg = "[문자온] 포인트 현금 전환 요청 - " + user.getName() +"("+ user.getId() + ")";
				mjonCommon.sendSimpleSlackMsg(msg);			
			}
			
		}catch (Exception e) {
			modelAndView.addObject("result", "fail");
		}
		
		return modelAndView;
    	
    }
    
	/**
     * 포인트 현금 전환 요청 목록
     * @param searchVO
     * @param model
     * @return	"/uss/ion/msg/pointUseCashList"
     * @throws Exception
     */
    @RequestMapping(value= {"/uss/ion/pay/pointUseCashList.do"})
	public String pointUseCashList(@ModelAttribute("searchVO") MjonPayVO mjonPayVO, 
			HttpServletRequest request,
			ModelMap model) throws Exception{
    	
    	String pattern = (String) request.getAttribute(
                HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE) ;
    	
		/** pageing */
		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(mjonPayVO.getPageIndex());
		paginationInfo.setRecordCountPerPage(mjonPayVO.getPageUnit());
		paginationInfo.setPageSize(mjonPayVO.getPageSize());
		
		mjonPayVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
		mjonPayVO.setLastIndex(paginationInfo.getLastRecordIndex());
		mjonPayVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
		
		if("".equals(mjonPayVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
			mjonPayVO.setSearchSortCnd("frstRegistPnttm");
			mjonPayVO.setSearchSortOrd("desc");
		}
		
		mjonPayVO.setType("1"); 	// 현금
        List<MjonPayVO> resultList = mjonPayService.selectPointUseList(mjonPayVO);
        model.addAttribute("resultList", resultList);
        paginationInfo.setTotalRecordCount(resultList.size() > 0 ? ((MjonPayVO)resultList.get(0)).getTotCnt() : 0);
		model.addAttribute("paginationInfo", paginationInfo);
		
		return "/uss/ion/pay/PointUseCashList";
	}
    
	/**
     * 포인트 현금 전환 요청 상세
     * @param searchVO
     * @param model
     * @return	"/uss/ion/msg/pointuseCashDetail"
     * @throws Exception
     */
    @RequestMapping(value= {"/uss/ion/pay/pointUseCashDetail.do"})
	public String pointUseCashDetail(@ModelAttribute("searchVO") MjonPayVO mjonPayVO, 
			HttpServletRequest request,
			ModelMap model) throws Exception{
    	
    	String pattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE) ;
    	
        mjonPayVO = mjonPayService.selectPointUseDetail(mjonPayVO);
        model.addAttribute("mjonPayVO", mjonPayVO);
        
        String userId = mjonPayVO.getUserId();
		//회원 캐시 및 포인트 조회하기
  		String userPoint = "0";
  		MjonMsgVO mjonMsgVO = new MjonMsgVO();
  		mjonMsgVO.setUserId(userId);

		//보유 포인트 정보 불러오기
		userPoint = mjonMsgDataService.selectBeforePointData(mjonMsgVO);
		model.addAttribute("userPoint", userPoint);
		
		return "/uss/ion/pay/PointUseCashDetail";
	}    
    
	/**
     * 포인트 전환 내역 목록
     * @param searchVO
     * @param model
     * @return	"/uss/ion/msg/pointuseList"
     * @throws Exception
     */
    @RequestMapping(value= {"/uss/ion/pay/pointUseList.do"})
	public String pointuseList(@ModelAttribute("searchVO") MjonPayVO mjonPayVO, 
			HttpServletRequest request,
			ModelMap model) throws Exception{
    	
    	String pattern = (String) request.getAttribute(
                HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE) ;
    	
		/** pageing */
		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(mjonPayVO.getPageIndex());
		paginationInfo.setRecordCountPerPage(mjonPayVO.getPageUnit());
		paginationInfo.setPageSize(mjonPayVO.getPageSize());
		
		mjonPayVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
		mjonPayVO.setLastIndex(paginationInfo.getLastRecordIndex());
		mjonPayVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
		
		if("".equals(mjonPayVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
			mjonPayVO.setSearchSortCnd("pointUseId");
			mjonPayVO.setSearchSortOrd("desc");
		}
		
		mjonPayVO.setType("2"); 	// 보유 포인트
        List<MjonPayVO> resultList = mjonPayService.selectPointUseList(mjonPayVO);
        model.addAttribute("resultList", resultList);
        paginationInfo.setTotalRecordCount(resultList.size() > 0 ? ((MjonPayVO)resultList.get(0)).getTotCnt() : 0);
		model.addAttribute("paginationInfo", paginationInfo);
		
		return "/uss/ion/pay/PointUseList";
	}
    
	/**
     * 포인트 전환 내역 상세
     * @param searchVO
     * @param model
     * @return	"/uss/ion/msg/pointuseDetail"
     * @throws Exception
     */
    @RequestMapping(value= {"/uss/ion/pay/pointUseDetail.do"})
	public String pointUseDetail(@ModelAttribute("searchVO") MjonPayVO mjonPayVO, 
			HttpServletRequest request,
			ModelMap model) throws Exception{
    	
    	String pattern = (String) request.getAttribute(
                HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE) ;
    	
        mjonPayVO = mjonPayService.selectPointUseDetail(mjonPayVO);
        model.addAttribute("mjonPayVO", mjonPayVO);
		
		return "/uss/ion/pay/PointUseDetail";
	}    
    
    /**
     * 포인트 등록/수정
     * @param searchVO
     * @param model
     * @return	"/uss/ion/pay/PointUseModify.do"
     * @throws Exception
     */
    @RequestMapping(value = {"/uss/ion/pay/PointUseModify.do"})
    public String PointUseModify(
            @ModelAttribute("searchVO") MjonPayVO searchVO, 
            HttpServletRequest request ,
            Model model) throws Exception {
    	
		model.addAttribute("searchVO", searchVO);
		return "/uss/ion/pay/PointUseModify";
    }    
    
    // 포인트를 캐시로 전환
    @RequestMapping(value = {"/uss/ion/pay/InsertUsePointAdmAjax.do"})
    public ModelAndView insertUsePoint(
            @ModelAttribute("searchVO") MjonPayVO mjonPayVO
            ,HttpServletRequest request) throws Exception {
    	
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");

		boolean isSuccess = true;
		String msg = "";
    	
    	try {
    		MjonMsgVO mjonMsgVO = new MjonMsgVO();
    		mjonMsgVO.setUserId(mjonPayVO.getUserId());
        	int befPoint = Integer.parseInt(mjonMsgDataService.selectBeforePointData(mjonMsgVO));
        	if (befPoint < mjonPayVO.getPoint()) {
        		isSuccess = false;
	    		msg = "보유포인트보다 이전할 포인트가 더 많습니다. 보유포인트를 확인해주세요.";
        	}
        	else {
	    		LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
	        	String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
	        	mjonPayVO.setFrstRegisterId(userId);
				mjonPayVO.setMemo("잔액 "+mjonPayVO.getPoint()+" 전환");
				mjonPayVO.setType("2");
				mjonPayVO.setScreenYn("Y");	// 사용자화면 노출여부
				mjonPayVO.setCmpltYn("Y");  // 잔액 전환 시 바로 처리        	
	        	mjonPayService.insertPointUseAdm(mjonPayVO);
        	}
    	}catch(Exception e) {
			isSuccess = false;
			msg = e.getMessage();    		
    	}
		
		modelAndView.addObject("isSuccess", isSuccess);
		modelAndView.addObject("msg", msg);
		
		return modelAndView;
    }
    
    /**
     * 포인트 사용 완료처리 변경 OLD
     * @param searchVO
     * @param model
     * @return	"/uss/ion/pay/pointUseCashUpdateOLD.do"
     * @throws Exception
     */
    @RequestMapping(value = {"/uss/ion/pay/pointUseCashUpdateOLD.do"})
    public String pointUseUpdateOLD(
    		@RequestParam("chk") String[] chk,
    		@ModelAttribute("searchVO") MjonPayVO mjonPayVO, 
            HttpServletRequest request , RedirectAttributes redirectAttributes,
            Model model) throws Exception {
    	try {
    		LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
        	String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
        	for(String id: chk) {
        		mjonPayVO.setPointUseId(id);
        		mjonPayService.updatePointUse(mjonPayVO);
     	    }
    		redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.update"));
    		RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/uss/ion/pay/pointUseList.do");
    		return redirectUrlMaker.getRedirectUrl();
    	}catch(Exception e) {
    		redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.update"));
    	}
    	redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.update"));
		RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/uss/ion/pay/pointUseList.do");
		return redirectUrlMaker.getRedirectUrl();
    }    
    
    /**
     * 포인트 사용 완료처리 변경
     */
	@RequestMapping(value="/uss/ion/pay/pointUseCashUpdateAjax.do")
	public ModelAndView addrRecvListAjax(@ModelAttribute("searchVO") MjonPayVO mjonPayVO, 
			HttpServletRequest request) throws Exception {
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");

		LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
    	String adminUserId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
    	
		boolean isSuccess = true;
		String msg = "전환불가 처리되었습니다.";
		
		try {
			mjonPayVO.setAdminRegisterId(adminUserId);
			mjonPayVO.setFrstRegisterId(mjonPayVO.getUserId());
			mjonPayVO.setUserId(mjonPayVO.getUserId());
			mjonPayService.updatePointUseByCase(mjonPayVO);
			
			//완료 처리 시 사용자에게 알림 문자 전송 
			if("Y".equals(mjonPayVO.getCmpltYn())){
				
				msg = "송금완료 처리되었습니다.";
				
				MjonCommon mjCommon = new MjonCommon();
				MjonMsgVO mjonMsgVO = new MjonMsgVO();
				
				mjonMsgVO.setCallFrom("01084329333");
				//포인트 3자리수 콤마 처리
				NumberFormat numberFormat = NumberFormat.getInstance();
				String point = numberFormat.format(mjonPayVO.getPoint());
				
				//발송 문자 타입(단/장문) 등록
				//문자열 길이 체크 해주기
	        	String charset = "euc-kr"; 						//문자 바이트 계산에 필요한 캐릭터 셋 : 한글 2Byte로 계산
	        	String smsTxt = "[문자온] 고객님, 요청하신 포인트 현금 전환("+point+"원) 처리가 완료되었습니다. 감사합니다.";
	        	mjonMsgVO.setSmsTxt(smsTxt);
	        	smsTxt = smsTxt.replace("\r\n", "\n");
	        	int FrBytes = smsTxt.getBytes(charset).length;
	        	String msgType = "4";
	        	
	        	//90바이트를 초과하는 경우 장문으로 발송
	        	if(FrBytes > 90){
	        		msgType = "6";
	        	}
	        	mjonMsgVO.setMsgType(msgType);
	        	
	        	
	        	//그림이미지 첨부파일 갯수 0으로 셋팅
	        	mjonMsgVO.setFileCnt("0");
	        	
				// 문자타입 구분
	    		if (mjonMsgVO.getMsgType().equals("4")) {
	    			mjonMsgVO.setMsgDiv("S");	// 단문	
				}
	    		else if (mjonMsgVO.getMsgType().equals("6")) {	
					if (mjonMsgVO.getFileCnt().equals("0")) {
						mjonMsgVO.setMsgDiv("L");	// 장문
					}
					else {
						mjonMsgVO.setMsgDiv("P");	// 그림
					}    			
				}    		
	        	
	    		// 문자타입별 대표전송사 정보
				MjonMsgVO mjonMsgVO2 = new MjonMsgVO();
				mjonMsgVO2 = mjonMsgService.selectRepMsgAgetnInfo(mjonMsgVO);
				// 전송사 구분 코드 - 01 : 아이하트, 02 : 현대 퓨쳐넷, 03 : 아이엠오, 04 : 다우기술
	        	mjonMsgVO.setAgentCode(mjonMsgVO2.getAgentCode()); //전송사 선택			
	        	// 전송금액
				mjonMsgVO.setTotPrice(mjonMsgVO2.getAgentPrice().toString());	//총금액
				mjonMsgVO.setEachPrice(mjonMsgVO2.getAgentPrice().toString());	//한건 금액
				
	        	
	        	mjonMsgVO.setCallTo(mjonPayVO.getMbtlNum());
	        	
				//문자발송을 위한 데이터 셋팅 함수 호출해주기
				MjonMsgVO resultCom = mjCommon.getAdminToMberPhoneSendMsgDataComm(mjonMsgVO);
				
				//발신으로 문자 발송 처리
				mjonMsgDataService.insertAdmToMberMsgDataInfo(resultCom);
				
				msg = msg += (System.lineSeparator()+"안내문자 발송 성공했습니다.");
			}
		}
		catch(Exception e) {
			isSuccess = false;
			msg = e.getMessage();
		}		

		modelAndView.addObject("isSuccess", isSuccess);
		modelAndView.addObject("msg", msg);
			
		return modelAndView;
	}    
    
	/**
	 * 요금사용내역 - > 사용내역서 팝업
	 * @param mjonMsgVO
	 * @param model
	 * @return	"/web/member/pay/printMsgUsageDetailsAjax.do"
	 * @throws Exception
	 */
    @RequestMapping(value= {"/web/member/pay/printMsgUsageDetailsAjax.do"})
	public String printMsgUsageDetailsAjax(@ModelAttribute("searchVO") MjonMsgVO mjonMsgVO,
			ModelMap model) throws Exception{
		
		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
		
		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
		mjonMsgVO.setUserId(userId);
    		
		int sendSumCount = 0;
    	double supplySumPrice = 0.0;    	
    	double vatSumPrice = 0.0;
    	double totalSumPrice = 0.0;
    	Date minRegDate = null;
    	Date maxRegDate = null;
    	int i = 0;
    	
    	SimpleDateFormat transFormat = new SimpleDateFormat("yyyy-MM-dd");
		List<MjonMsgVO> payUserSumList =  mjonMsgDataService.selectPayUserSumList(mjonMsgVO);
		for(MjonMsgVO item : payUserSumList) {
			sendSumCount += item.getSendCount();
			supplySumPrice += item.getSupplyPrice();
			vatSumPrice += item.getVatPrice();
			totalSumPrice += item.getTotalPrice();

			// 시작일, 종료일
			if (i == 0) {
				minRegDate = transFormat.parse(item.getMinRegDate());
				maxRegDate = transFormat.parse(item.getMaxRegDate());
			}
			else {
				if(minRegDate.after(transFormat.parse(item.getMinRegDate()))) {
					minRegDate = transFormat.parse(item.getMinRegDate());
				} 
				
				if(maxRegDate.before(transFormat.parse(item.getMaxRegDate()))) {
					maxRegDate = transFormat.parse(item.getMaxRegDate());
				} 		
			}
			
			i++;
		}

		// 현재 날짜 구하기 (시스템 시계, 시스템 타임존)
    	LocalDate now = LocalDate.now();
    	int year = now.getYear();
    	int month = now.getMonthValue();
    	int day = now.getDayOfMonth();
    	String monthStr = now.getMonthValue() > 9 ? "" + now.getMonthValue() : "0" + now.getMonthValue();
    	int lastDay = 0;
        Calendar cal = Calendar.getInstance();
        cal.set(year, month-1, day);
        lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
    	
    	model.addAttribute("year", year);
    	model.addAttribute("month", month);
    	model.addAttribute("day", day);
    	model.addAttribute("monthStr", monthStr);
    	model.addAttribute("lastDay", lastDay);
    	
    	String startDate = mjonMsgVO.getStartDate();
		if(!"".equals(startDate)) {
			startDate = startDate.replaceAll("/", "-");
    	}else {
    		startDate = transFormat.format(minRegDate);
    	}
    	model.addAttribute("startDate", startDate);
    	
    	String endDate = mjonMsgVO.getEndDate();
    	if(!"".equals(endDate)) {
    		endDate = endDate.replaceAll("/", "-");
    	}else {
    		endDate = transFormat.format(maxRegDate);
    	}
    	model.addAttribute("endDate", endDate);
    	
    	DecimalFormat decFormat = new DecimalFormat("###,###");
    	model.addAttribute("sendSumCount", decFormat.format(sendSumCount));
    	model.addAttribute("supplySumPrice", decFormat.format(supplySumPrice));
    	model.addAttribute("vatSumPrice", decFormat.format(vatSumPrice));
    	model.addAttribute("totalSumPrice", decFormat.format(totalSumPrice));
    	model.addAttribute("resultList", payUserSumList);
    	
    	// 수신자 정보
	    String mberNm = "";			// 회사명
	    String managerNm = "";		// 담당자명
	    String moblphonNo = "";		// 연락처
    	MberManageVO mberManageVO = new MberManageVO();
		mberManageVO = mjonMsgDataService.selectMberManageInfo(userId);
		if (mberManageVO != null) {
			// 회원종류 p-개인 c-기업
			if (mberManageVO.getDept().equals("c")) {
			    mberNm = mberManageVO.getMberNm();
			    managerNm = mberManageVO.getManagerNm();
			    moblphonNo = mberManageVO.getMoblphonNo();
			}
			else {
			    mberNm = mberManageVO.getMberNm();
			    managerNm = mberManageVO.getMberNm();
			    moblphonNo = mberManageVO.getMoblphonNo();
			}
		}
		
		model.addAttribute("mberNm", mberNm);
		model.addAttribute("managerNm", managerNm);
		model.addAttribute("moblphonNo", moblphonNo);

		
		return "/web/pay/MsgPrintUsageDetailsPopUp";
	}
    
	/**
	 * 요금사용내역 - > 사용내역서 팝업 카카오 추가
	 * @param mjonMsgVO
	 * @param model
	 * @return	"/web/member/pay/printMsgUsageDetailsAjax.do"
	 * @throws Exception
	 */
    @RequestMapping(value= {"/web/member/pay/printMsgWithKakaoUsageDetailsAjax.do"})
	public String printMsgWithKakaoUsageDetailsAjax(@ModelAttribute("searchVO") MjonMsgVO mjonMsgVO,
			ModelMap model) throws Exception{
		
		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
		
		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
		mjonMsgVO.setUserId(userId);
    		
		int sendSumCount = 0;
    	double supplySumPrice = 0.0;    	
    	double vatSumPrice = 0.0;
    	double totalSumPrice = 0.0;
    	Date minRegDate = null;
    	Date maxRegDate = null;
    	int i = 0;
    	
    	SimpleDateFormat transFormat = new SimpleDateFormat("yyyy-MM-dd");
		List<MjonMsgVO> payUserSumList =  mjonMsgDataService.selectPayUserWithKakaoSumList(mjonMsgVO);
		for(MjonMsgVO item : payUserSumList) {
			sendSumCount += item.getSendCount();
			supplySumPrice += item.getSupplyPrice();
			vatSumPrice += item.getVatPrice();
			totalSumPrice += item.getTotalPrice();

			// 시작일, 종료일
			if (i == 0) {
				minRegDate = transFormat.parse(item.getMinRegDate());
				maxRegDate = transFormat.parse(item.getMaxRegDate());
			}
			else {
				if(minRegDate.after(transFormat.parse(item.getMinRegDate()))) {
					minRegDate = transFormat.parse(item.getMinRegDate());
				} 
				
				if(maxRegDate.before(transFormat.parse(item.getMaxRegDate()))) {
					maxRegDate = transFormat.parse(item.getMaxRegDate());
				} 		
			}
			
			i++;
		}

		// 현재 날짜 구하기 (시스템 시계, 시스템 타임존)
    	LocalDate now = LocalDate.now();
    	int year = now.getYear();
    	int month = now.getMonthValue();
    	int day = now.getDayOfMonth();
    	String monthStr = now.getMonthValue() > 9 ? "" + now.getMonthValue() : "0" + now.getMonthValue();
    	int lastDay = 0;
        Calendar cal = Calendar.getInstance();
        cal.set(year, month-1, day);
        lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
    	
    	model.addAttribute("year", year);
    	model.addAttribute("month", month);
    	model.addAttribute("day", day);
    	model.addAttribute("monthStr", monthStr);
    	model.addAttribute("lastDay", lastDay);
    	
    	String startDate = mjonMsgVO.getStartDate();
		if(!"".equals(startDate)) {
			startDate = startDate.replaceAll("/", "-");
    	}else {
    		startDate = transFormat.format(minRegDate);
    	}
    	model.addAttribute("startDate", startDate);
    	
    	String endDate = mjonMsgVO.getEndDate();
    	if(!"".equals(endDate)) {
    		endDate = endDate.replaceAll("/", "-");
    	}else {
    		endDate = transFormat.format(maxRegDate);
    	}
    	model.addAttribute("endDate", endDate);
    	
    	DecimalFormat decFormat = new DecimalFormat("###,###");
    	model.addAttribute("sendSumCount", decFormat.format(sendSumCount));
    	model.addAttribute("supplySumPrice", decFormat.format(supplySumPrice));
    	model.addAttribute("vatSumPrice", decFormat.format(vatSumPrice));
    	model.addAttribute("totalSumPrice", decFormat.format(totalSumPrice));
    	model.addAttribute("resultList", payUserSumList);
    	
    	// 수신자 정보
	    String mberNm = "";			// 회사명
	    String managerNm = "";		// 담당자명
	    String moblphonNo = "";		// 연락처
    	MberManageVO mberManageVO = new MberManageVO();
		mberManageVO = mjonMsgDataService.selectMberManageInfo(userId);
		if (mberManageVO != null) {
			// 회원종류 p-개인 c-기업
			if (mberManageVO.getDept().equals("c")) {
			    mberNm = mberManageVO.getMberNm();
			    managerNm = mberManageVO.getManagerNm();
			    moblphonNo = mberManageVO.getMoblphonNo();
			}
			else {
			    mberNm = mberManageVO.getMberNm();
			    managerNm = mberManageVO.getMberNm();
			    moblphonNo = mberManageVO.getMoblphonNo();
			}
		}
		
		model.addAttribute("mberNm", mberNm);
		model.addAttribute("managerNm", managerNm);
		model.addAttribute("moblphonNo", moblphonNo);

		
		return "/web/pay/MsgPrintUsageDetailsPopUp";
	}
        
    /**
     * 요금사용내역 - > 거레명세서 팝업
     * @param mjonMsgVO
     * @param model
     * @return	"/web/member/pay/printMsgStatementAjax.do"
     * @throws Exception
     */
    @RequestMapping(value= {"/web/member/pay/printMsgStatementAjax.do"})
    public String printMsgStatementAjax(@ModelAttribute("searchVO") MjonMsgVO mjonMsgVO,
    		ModelMap model) throws Exception{
    	
    	LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
    	
    	String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
    	mjonMsgVO.setUserId(userId);
    	
    	int sendSumCount = 0;
    	double supplySumPrice = 0.0;    	
    	double vatSumPrice = 0.0;
    	double totalSumPrice = 0.0;
    	Date minRegDate = null;
    	Date maxRegDate = null;
    	int i = 0;
    	
    	SimpleDateFormat transFormat = new SimpleDateFormat("yyyy-MM-dd");
		List<MjonMsgVO> payUserSumList =  mjonMsgDataService.selectPayUserSumList(mjonMsgVO);
		for(MjonMsgVO item : payUserSumList) {
			sendSumCount += item.getSendCount();
			supplySumPrice += item.getSupplyPrice();
			vatSumPrice += item.getVatPrice();
			totalSumPrice += item.getTotalPrice();
			
			// 시작일, 종료일
			if (i == 0) {
				minRegDate = transFormat.parse(item.getMinRegDate());
				maxRegDate = transFormat.parse(item.getMaxRegDate());
			}
			else {
				if(minRegDate.after(transFormat.parse(item.getMinRegDate()))) {
					minRegDate = transFormat.parse(item.getMinRegDate());
				} 
				
				if(maxRegDate.before(transFormat.parse(item.getMaxRegDate()))) {
					maxRegDate = transFormat.parse(item.getMaxRegDate());
				} 		
			}
			
			i++;			
		}
		
		// 현재 날짜 구하기 (시스템 시계, 시스템 타임존)
    	LocalDate now = LocalDate.now();
    	int year = now.getYear();
    	int month = now.getMonthValue();
    	int day = now.getDayOfMonth();
    	String monthStr = now.getMonthValue() > 9 ? "" + now.getMonthValue() : "0" + now.getMonthValue();
    	int lastDay = 0;
        Calendar cal = Calendar.getInstance();
        cal.set(year, month-1, day);
        lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
    	
        model.addAttribute("year", year);
    	model.addAttribute("month", month);
    	model.addAttribute("day", day);
    	model.addAttribute("monthStr", monthStr);
    	model.addAttribute("lastDay", lastDay);
    	
    	String startDate = mjonMsgVO.getStartDate();
    	if(!"".equals(startDate)) {
			startDate = startDate.replaceAll("/", "-");
    	}else {
    		startDate = transFormat.format(minRegDate);
    	}
    	model.addAttribute("startDate", startDate);
    	
    	String endDate = mjonMsgVO.getEndDate();
    	if(!"".equals(endDate)) {
    		endDate = endDate.replaceAll("/", "-");
    	}else {
    		endDate = transFormat.format(maxRegDate);
    	}
    	model.addAttribute("endDate", endDate);
    	
    	
    	DecimalFormat decFormat = new DecimalFormat("###,###");
    	model.addAttribute("sendSumCount", decFormat.format(sendSumCount));
    	model.addAttribute("supplySumPrice", decFormat.format(supplySumPrice));
    	model.addAttribute("vatSumPrice", decFormat.format(vatSumPrice));
    	model.addAttribute("totalSumPrice", decFormat.format(totalSumPrice));
    	model.addAttribute("resultList", payUserSumList);
    	
    	// 수신자 정보
	    String mberNm = "";			// 회사명
	    String managerNm = "";		// 담당자명
	    String moblphonNo = "";		// 연락처
    	MberManageVO mberManageVO = new MberManageVO();
		mberManageVO = mjonMsgDataService.selectMberManageInfo(userId);
		if (mberManageVO != null) {
			// 회원종류 p-개인 c-기업
			if (mberManageVO.getDept().equals("c")) {
			    mberNm = mberManageVO.getMberNm();
			    managerNm = mberManageVO.getManagerNm();
			    moblphonNo = mberManageVO.getMoblphonNo();
			}
			else {
			    mberNm = mberManageVO.getMberNm();
			    managerNm = mberManageVO.getMberNm();
			    moblphonNo = mberManageVO.getMoblphonNo();
			}
		}
		
		model.addAttribute("mberNm", mberNm);
		model.addAttribute("managerNm", managerNm);
		model.addAttribute("moblphonNo", moblphonNo);
		
    	return "/web/pay/MsgPrintStatementPopUp";
    }
    
    /**
     * 요금사용내역 - > 거레명세서 팝업(카카오 추가)
     * @param mjonMsgVO
     * @param model
     * @return	"/web/member/pay/printMsgWithKakaoStatementAjax.do"
     * @throws Exception
     */
    @RequestMapping(value= {"/web/member/pay/printMsgWithKakaoStatementAjax.do"})
    public String printMsgWithKakaoStatementAjax(@ModelAttribute("searchVO") MjonMsgVO mjonMsgVO,
    		ModelMap model) throws Exception{
    	
    	LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
    	
    	String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
    	mjonMsgVO.setUserId(userId);
    	
    	int sendSumCount = 0;
    	double supplySumPrice = 0.0;    	
    	double vatSumPrice = 0.0;
    	double totalSumPrice = 0.0;
    	Date minRegDate = null;
    	Date maxRegDate = null;
    	int i = 0;
    	
    	SimpleDateFormat transFormat = new SimpleDateFormat("yyyy-MM-dd");
		List<MjonMsgVO> payUserSumList =  mjonMsgDataService.selectPayUserWithKakaoSumList(mjonMsgVO);
		for(MjonMsgVO item : payUserSumList) {
			sendSumCount += item.getSendCount();
			supplySumPrice += item.getSupplyPrice();
			vatSumPrice += item.getVatPrice();
			totalSumPrice += item.getTotalPrice();
			
			// 시작일, 종료일
			if (i == 0) {
				minRegDate = transFormat.parse(item.getMinRegDate());
				maxRegDate = transFormat.parse(item.getMaxRegDate());
			}
			else {
				if(minRegDate.after(transFormat.parse(item.getMinRegDate()))) {
					minRegDate = transFormat.parse(item.getMinRegDate());
				} 
				
				if(maxRegDate.before(transFormat.parse(item.getMaxRegDate()))) {
					maxRegDate = transFormat.parse(item.getMaxRegDate());
				} 		
			}
			
			i++;			
		}
		
		// 현재 날짜 구하기 (시스템 시계, 시스템 타임존)
    	LocalDate now = LocalDate.now();
    	int year = now.getYear();
    	int month = now.getMonthValue();
    	int day = now.getDayOfMonth();
    	String monthStr = now.getMonthValue() > 9 ? "" + now.getMonthValue() : "0" + now.getMonthValue();
    	int lastDay = 0;
        Calendar cal = Calendar.getInstance();
        cal.set(year, month-1, day);
        lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
    	
        model.addAttribute("year", year);
    	model.addAttribute("month", month);
    	model.addAttribute("day", day);
    	model.addAttribute("monthStr", monthStr);
    	model.addAttribute("lastDay", lastDay);
    	
    	String startDate = mjonMsgVO.getStartDate();
    	if(!"".equals(startDate)) {
			startDate = startDate.replaceAll("/", "-");
    	}else {
    		startDate = transFormat.format(minRegDate);
    	}
    	model.addAttribute("startDate", startDate);
    	
    	String endDate = mjonMsgVO.getEndDate();
    	if(!"".equals(endDate)) {
    		endDate = endDate.replaceAll("/", "-");
    	}else {
    		endDate = transFormat.format(maxRegDate);
    	}
    	model.addAttribute("endDate", endDate);
    	
    	
    	DecimalFormat decFormat = new DecimalFormat("###,###");
    	model.addAttribute("sendSumCount", decFormat.format(sendSumCount));
    	model.addAttribute("supplySumPrice", decFormat.format(supplySumPrice));
    	model.addAttribute("vatSumPrice", decFormat.format(vatSumPrice));
    	model.addAttribute("totalSumPrice", decFormat.format(totalSumPrice));
    	model.addAttribute("resultList", payUserSumList);
    	
    	// 수신자 정보
	    String mberNm = "";			// 회사명
	    String managerNm = "";		// 담당자명
	    String moblphonNo = "";		// 연락처
    	MberManageVO mberManageVO = new MberManageVO();
		mberManageVO = mjonMsgDataService.selectMberManageInfo(userId);
		if (mberManageVO != null) {
			// 회원종류 p-개인 c-기업
			if (mberManageVO.getDept().equals("c")) {
			    mberNm = mberManageVO.getMberNm();
			    managerNm = mberManageVO.getManagerNm();
			    moblphonNo = mberManageVO.getMoblphonNo();
			}
			else {
			    mberNm = mberManageVO.getMberNm();
			    managerNm = mberManageVO.getMberNm();
			    moblphonNo = mberManageVO.getMoblphonNo();
			}
		}
		
		model.addAttribute("mberNm", mberNm);
		model.addAttribute("managerNm", managerNm);
		model.addAttribute("moblphonNo", moblphonNo);
		
    	return "/web/pay/MsgPrintStatementPopUp";
    }    
    /**
     * 일별 결제 통계
     * @param searchVO
     * @param model
     * @return	"/uss/ion/pay/payDayChart"
     * @throws Exception
     */
    @RequestMapping(value= {"/uss/ion/pay/payDayChart.do"})
	public String selectPayDayChart(@ModelAttribute("searchVO") MjonPayVO mjonPayVO, 
			HttpServletRequest request,
			ModelMap model) throws Exception{
    	
    	String pattern = (String) request.getAttribute(
                HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE) ;
    	
    	//오늘   
    	Date today = new Date();    
    	SimpleDateFormat date = new SimpleDateFormat("yyyy-MM-dd");    
    	String toDay = date.format(today);    
    	
    	//한달 전    
    	Calendar mon = Calendar.getInstance();    
    	mon.add(Calendar.MONTH , -1);    
    	String beforeMonthDay = new java.text.SimpleDateFormat("yyyy-MM-dd").format(mon.getTime());    
    	
    	if (null == mjonPayVO.getNtceBgnde() || mjonPayVO.getNtceBgnde().equals("")) {
	    	mjonPayVO.setNtceBgnde(beforeMonthDay);
	    	mjonPayVO.setNtceEndde(toDay); 
    	}
    	
		/** pageing */
		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(mjonPayVO.getPageIndex());
		paginationInfo.setRecordCountPerPage(mjonPayVO.getPageUnit());
		paginationInfo.setPageSize(mjonPayVO.getPageSize());
		
		mjonPayVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
		mjonPayVO.setLastIndex(paginationInfo.getLastRecordIndex());
		mjonPayVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
		
		if("".equals(mjonPayVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
			mjonPayVO.setSearchSortCnd("regDate");
			mjonPayVO.setSearchSortOrd("desc");
		}
		
        List<MjonPayVO> resultList = mjonPayService.selectPayDayChart(mjonPayVO);   
        

        // Total List
		mjonPayVO.setFirstIndex(0);
		mjonPayVO.setRecordCountPerPage(10000);
		if("".equals(mjonPayVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
			mjonPayVO.setSearchSortCnd("regDate");
			mjonPayVO.setSearchSortOrd("desc");
		}
		
        List<MjonPayVO> resultList2 = mjonPayService.selectPayDayChart(mjonPayVO);           
    	// Total
    	long amtCardSumTot = 0; //전체 신용카드 결제 금액
    	long amtSpaySumTot = 0; //전체 간편결제 결제 금액
    	long amtCellSumTot = 0; //전체 휴대폰 결제 금액
    	long amtBankSumTot = 0; //전체 즉시이체 결제 금액
    	long amtVbankSumTot = 0; //전체 전용계좌 결제 금액
    	long amtRefundSumTot = 0; //전체 환불 금액
    	long amtTotSumTot = 0; //전체 결제 금액 총액
    	
    	for(MjonPayVO item: resultList2) {
        	amtCardSumTot += Long.parseLong(item.getAmtCardSum());
        	amtSpaySumTot += Long.parseLong(item.getAmtSpaySum());
        	amtCellSumTot += Long.parseLong(item.getAmtCellSum());
        	amtBankSumTot += Long.parseLong(item.getAmtBankSum());
        	amtVbankSumTot += Long.parseLong(item.getAmtVbankSum());
        	amtRefundSumTot += Long.parseLong(item.getAmtRefundSum());
        	amtTotSumTot += Long.parseLong(item.getAmtTotSum());
 	    }    	
    	
    	mjonPayVO.setAmtCardSumTot(amtCardSumTot + "");
    	mjonPayVO.setAmtSpaySumTot(amtSpaySumTot + "");
    	mjonPayVO.setAmtCellSumTot(amtCellSumTot + "");
    	mjonPayVO.setAmtBankSumTot(amtBankSumTot + "");
    	mjonPayVO.setAmtVbankSumTot(amtVbankSumTot + "");
    	mjonPayVO.setAmtRefundSumTot(amtRefundSumTot + "");
    	mjonPayVO.setAmtTotSumTot(amtTotSumTot + "");
    	
    	model.addAttribute("mjonPayVO", mjonPayVO);
    	
        model.addAttribute("resultList", resultList);
        paginationInfo.setTotalRecordCount(resultList.size() > 0 ? ((MjonPayVO)resultList.get(0)).getTotCnt() : 0);
		model.addAttribute("paginationInfo", paginationInfo);
		
		return "/uss/ion/pay/PayDayChart";
	}
    /**
     * 월별 결제 통계
     * @param searchVO
     * @param model
     * @return	"/uss/ion/pay/payDayChart"
     * @throws Exception
     */
    @RequestMapping(value= {"/uss/ion/pay/payMonthChart.do"})
    public String selectPayMonthChart(@ModelAttribute("searchVO") MjonPayVO mjonPayVO, 
    		HttpServletRequest request,
    		ModelMap model) throws Exception{
    	
    	String pattern = (String) request.getAttribute(
    			HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE) ;
    	
    	/** pageing */
    /*	PaginationInfo paginationInfo = new PaginationInfo();
    	paginationInfo.setCurrentPageNo(mjonPayVO.getPageIndex());
    	paginationInfo.setRecordCountPerPage(mjonPayVO.getPageUnit());
    	paginationInfo.setPageSize(mjonPayVO.getPageSize());
    	
    	mjonPayVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
    	mjonPayVO.setLastIndex(paginationInfo.getLastRecordIndex());
    	mjonPayVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());*/
    	
    	if("".equals(mjonPayVO.getNtceBgnde()) || mjonPayVO.getNtceBgnde() == null){ //최초조회시 현재년도 조회
    		 LocalDate now = LocalDate.now();
    		 int year = now.getYear();
    		 mjonPayVO.setNtceBgnde(Integer.toString(year));
    	}
    	if("".equals(mjonPayVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
    		mjonPayVO.setSearchSortCnd("regDate");
    		mjonPayVO.setSearchSortOrd("desc");
    	}
    	
		mjonPayVO.setFirstIndex(0);
		mjonPayVO.setRecordCountPerPage(100);    	
    	List<MjonPayVO> resultList = mjonPayService.selectPayMonthChart(mjonPayVO);   

    	// Total
    	long amtCardSumTot = 0; //전체 신용카드 결제 금액
    	long amtSpaySumTot = 0; //전체 간편결제 결제 금액
    	long amtCellSumTot = 0; //전체 휴대폰 결제 금액
    	long amtBankSumTot = 0; //전체 즉시이체 결제 금액
    	long amtVbankSumTot = 0; //전체 전용계좌 결제 금액
    	long amtRefundSumTot = 0; //전체 환불 금액
    	long amtTotSumTot = 0; //전체 결제 금액 총액
    	
    	for(MjonPayVO item: resultList) {
        	amtCardSumTot += Long.parseLong(item.getAmtCardSum());
        	amtSpaySumTot += Long.parseLong(item.getAmtSpaySum());
        	amtCellSumTot += Long.parseLong(item.getAmtCellSum());
        	amtBankSumTot += Long.parseLong(item.getAmtBankSum());
        	amtVbankSumTot += Long.parseLong(item.getAmtVbankSum());
        	amtRefundSumTot += Long.parseLong(item.getAmtRefundSum());
        	amtTotSumTot += Long.parseLong(item.getAmtTotSum());
 	    }    	
    	
    	mjonPayVO.setAmtCardSumTot(amtCardSumTot + "");
    	mjonPayVO.setAmtSpaySumTot(amtSpaySumTot + "");
    	mjonPayVO.setAmtCellSumTot(amtCellSumTot + "");
    	mjonPayVO.setAmtBankSumTot(amtBankSumTot + "");
    	mjonPayVO.setAmtVbankSumTot(amtVbankSumTot + "");
    	mjonPayVO.setAmtRefundSumTot(amtRefundSumTot + "");
    	mjonPayVO.setAmtTotSumTot(amtTotSumTot + "");
    	
    	model.addAttribute("mjonPayVO", mjonPayVO);
    	model.addAttribute("resultList", resultList);
    	
    	PaginationInfo paginationInfo = new PaginationInfo();
    	paginationInfo.setTotalRecordCount(resultList.size() > 0 ? ((MjonPayVO)resultList.get(0)).getTotCnt() : 0);
    	model.addAttribute("paginationInfo", paginationInfo);
    	
    	return "/uss/ion/pay/PayMonthChart";
    }
    
/*    @RequestMapping(value= {"/web/main/vacTest.do"})
    public void vacTest() throws Exception {
    	
    	schdlrManageService.msgFailPayBack();
    	
    }*/
    
    /**
     * * 캐시 , 포인트 이전 등록화면
     * @param searchVO
     * @param model
     * @return	"/uss/ion/pay/cashPointSendInsertView.do"
     * @throws Exception
     */
    @RequestMapping(value = {"/uss/ion/pay/cashPointSendInsertView.do"})
    public String cashPointSendInsertView(
            @ModelAttribute("searchVO") MjonPayVO mjonPayVO) throws Exception {
    	
		return "/uss/ion/pay/cashPointSendRegist";
    }
    /**
     * * 캐시 , 포인트 이전 등록 시 ID 존재 여부 확인 ajax
     * @param searchVO
     * @param model
     * @return	"/uss/ion/pay/cashPointSendIdCheckAjax.do"
     * @throws Exception
     */
    @RequestMapping(value = {"/uss/ion/pay/cashPointSendIdCheckAjax.do"})
    public ModelAndView cashPointSendIdCheckAjax(
            @ModelAttribute("searchVO") MjonPayVO mjonPayVO) throws Exception {
    	ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		modelAndView.addObject("result", "success");
    	//받는, 보내는 아이디 존재하는지 체크
    	int recvIdCnt = 0;
    	int sendIdCnt = 0;
    	recvIdCnt = mjonPayService.selectCashPointSendIdCnt(mjonPayVO.getRecvUserId());
    	sendIdCnt = mjonPayService.selectCashPointSendIdCnt(mjonPayVO.getSendUserId());
    	
    	if(recvIdCnt != 1) {
    		modelAndView.addObject("result", "fail");
    		modelAndView.addObject("msg", "받는 아이디가 존재하지 않습니다.");
    	}else if(sendIdCnt != 1) {
    		modelAndView.addObject("result", "fail");
    		modelAndView.addObject("msg", "보내는 아이디가 존재하지 않습니다.");
    		
    	}
    	//받는, 보내는 아이디가 있을 경우 보내는 아이디의 보유 캐시, 포인트 확인
    	if(recvIdCnt == 1 && sendIdCnt == 1) {
        	MjonPayVO mjonUserPayVO = mjonPayService.selectCashPoint(mjonPayVO.getSendUserId());
        	if(mjonUserPayVO != null) {
	        	if(mjonPayVO.getCash() > mjonUserPayVO.getUserMoneyDouble()) {
	        		modelAndView.addObject("result", "fail");
	        		modelAndView.addObject("msg", "보내려는 캐시가 보유 캐시보다 많습니다.");    		
	        	}else if(mjonPayVO.getPoint() > mjonUserPayVO.getUserPoint()) {
	        		modelAndView.addObject("result", "fail");
	        		modelAndView.addObject("msg", "보내려는 포인트가 보유 포인트보다 많습니다.");    		
	        	}
        	}
    	}
		return modelAndView;
    }
    
    /**
     * * 캐시 , 포인트 이전 등록
     * @param searchVO
     * @param model
     * @return	"/uss/ion/pay/CashInsert.do"
     * @throws Exception
     */
    @RequestMapping(value = {"/uss/ion/pay/insertCashPointSendAjax.do"})
    public ModelAndView insertCashPointSendAjax(
            @ModelAttribute("searchVO") MjonPayVO mjonPayVO) throws Exception {
    	ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		modelAndView.addObject("result", "success");
		modelAndView.addObject("msg", "저장되었습니다.");
    	try {
		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
		mjonPayVO.setAdmUserId(userId);
		mjonPayService.insertMjCashPointSend(mjonPayVO);
    	}catch(Exception e) {
    		modelAndView.addObject("result", "fail");
    		modelAndView.addObject("msg", "저장에 실패했습니다.");
    	}
		return modelAndView;
    }

    /**
     * * 캐시 , 포인트 이전 목록화면
     * @param searchVO
     * @param model
     * @return	"/uss/ion/pay/selectCashPointSendList.do"
     * @throws Exception
     */
    @RequestMapping(value = {"/uss/ion/pay/selectCashPointSendList.do"})
    public String selectCashPointSendList(
            @ModelAttribute("searchVO") MjonPayVO mjonPayVO, ModelMap model) throws Exception {

		/** pageing */
		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(mjonPayVO.getPageIndex());
		paginationInfo.setRecordCountPerPage(mjonPayVO.getPageUnit());
		paginationInfo.setPageSize(mjonPayVO.getPageSize());
		
		mjonPayVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
		mjonPayVO.setLastIndex(paginationInfo.getLastRecordIndex());
		mjonPayVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
		
		if("".equals(mjonPayVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
			mjonPayVO.setSearchSortCnd("sendNo");
			mjonPayVO.setSearchSortOrd("desc");
		}
    	
		List<MjonPayVO> resultList = mjonPayService.selectCashPointSendList(mjonPayVO);
        model.addAttribute("resultList", resultList);
        paginationInfo.setTotalRecordCount(resultList.size() > 0 ? ((MjonPayVO)resultList.get(0)).getTotCnt() : 0);
		model.addAttribute("paginationInfo", paginationInfo);
		
		return "/uss/ion/pay/cashPointSendList";
    }    
}

