package itn.let.uat.uia.web;

import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
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 org.springframework.stereotype.Controller;
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.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import com.icert.comm.secu.IcertSecuManager;

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.LoginVO;
import itn.com.cmm.service.EgovCmmUseService;
import itn.com.cmm.service.EgovFileMngService;
import itn.com.cmm.service.EgovFileMngUtil;
import itn.com.cmm.service.FileVO;
import itn.com.cmm.util.MJUtil;
import itn.com.cmm.util.RedirectUrlMaker;
import itn.com.cmm.util.StringUtil;
import itn.com.utl.fcc.service.EgovStringUtil;
import itn.let.fax.user.service.FaxGroupDataVO;
import itn.let.fax.user.service.FaxService;
import itn.let.kakao.user.sent.service.KakaoSentService;
import itn.let.kakao.user.sent.service.KakaoSentVO;
import itn.let.mjo.cert.service.CertService;
import itn.let.mjo.cert.service.CertVO;
import itn.let.mjo.event.service.MjonEventService;
import itn.let.mjo.event.service.MjonEventVO;
import itn.let.mjo.kisa.service.KisaService;
import itn.let.mjo.kisa.service.KisaVO;
import itn.let.mjo.mjocommon.MjonCommon;
import itn.let.mjo.msg.service.MjPhoneMemberVO;
import itn.let.mjo.msg.service.MjonMsgService;
import itn.let.mjo.msg.service.MjonMsgVO;
import itn.let.mjo.msgdata.service.MjonMsgDataService;
import itn.let.mjo.msgsent.service.MjonMsgSentService;
import itn.let.mjo.msgsent.service.MjonMsgSentVO;
import itn.let.mjo.pay.service.KmcVO;
import itn.let.mjo.pay.service.MjonPayService;
import itn.let.mjo.pay.service.MjonPayVO;
import itn.let.sym.site.service.EgovSiteManagerService;
import itn.let.sym.site.service.JoinSettingVO;
import itn.let.uat.uia.service.AuthCertVO;
import itn.let.uat.uia.service.EgovLoginService;
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.user.service.MjonNoticeSendUtil;

/**
 * 일반 로그인, 인증서 로그인을 처리하는 컨트롤러 클래스
 * 
 * @author 공통서비스 개발팀 박지욱
 * @since 2009.03.06
 * @version 1.0
 * @see
 *
 *      <pre>
 * << 개정이력(Modification Information) >>
 *
 *   수정일      수정자          수정내용
 *  -------    --------    ---------------------------
 *  2009.03.06  박지욱          최초 생성
 *  2011.08.31  JJY            경량환경 템플릿 커스터마이징버전 생성
 *
 *      </pre>
 */
@Controller
public class EgovMypageController {

	static String RSA_WEB_KEY = "_RSA_WEB_Key_"; // 개인키 session key
	static String RSA_INSTANCE = "RSA"; // rsa transformation

	@Resource(name = "KakaoSentService")
	private KakaoSentService kakaoSentService;
	
	@Resource(name = "faxService")
	private FaxService faxService;
	
	/** EgovLoginService */
	@Resource(name = "loginService")
	private EgovLoginService loginService;

	/** userManageService */
	@Resource(name = "userManageService")
	private EgovUserManageService userManageService;
	
	/** mberManageService */
	@Resource(name = "mberManageService")
	private EgovMberManageService mberManageService;
	
	@Resource(name = "mjonMsgService")
	private MjonMsgService mjonMsgService;
	
	@Resource(name="egovCertEtcIdGnrService")
	private EgovIdGnrService egovCertEtcIdGnrService;
	
	@Resource(name = "certService")
	private CertService certService;
	
	@Resource(name="EgovFileMngUtil")
	private EgovFileMngUtil fileUtil;
	
	@Resource(name="EgovFileMngService")
	private EgovFileMngService fileMngService;
	
	@Resource(name = "EgovCmmUseService")
	private EgovCmmUseService cmmUseService;
	
	@Resource(name = "EgovFileMngService")
	private EgovFileMngService fileService;
	
	@Resource(name = "KisaService")
    private KisaService kisaService;
	
	/** 알림전송 Util */
	@Resource(name = "mjonNoticeSendUtil")
	private MjonNoticeSendUtil mjonNoticeSendUtil;
	
	@Resource(name = "MjonMsgDataService")
    private MjonMsgDataService mjonMsgDataService;
	
	@Resource(name = "MjonMsgSentService")
    private MjonMsgSentService mjonMsgSentService;
	
	@Resource(name = "mjonPayService")
    private MjonPayService mjonPayService;
	
	@Resource(name = "MjonEventService")
    private MjonEventService mjonEventService;
	
	@Resource(name="MjonCommon")
	private MjonCommon mjonCommon;
	
	/** 사이트 설정 */ 
	@Resource(name = "egovSiteManagerService")
	EgovSiteManagerService egovSiteManagerService;
	
	/**
	 * 마이페이지 비밀번호 변경 탭
	 */
	@RequestMapping(value="/web/user/mberInfoIndex.do")
	public String mberInfoIndex(
		ModelMap model
		, RedirectAttributes redirectAttributes) throws Exception {
		
		//로그인 권한정보 불러오기
		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
		String author = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getAuthority());

		if(userId == "") {
			//redirectAttributes.addFlashAttribute("message", "문자온 서비스는 로그인 후 이용 가능합니다.");
			return "redirect:/web/user/login/login.do";
		}
		
		{//문자 전송 개인 단가 불러오기
			
			//0.이벤트 진행중이 회원 정보 불러오기.
			//이벤트 회원 정보 테이블에서 대상자의 정보를 불러온다.
			MjonEventVO mjonEventVO = new MjonEventVO();
			mjonEventVO.setMberId(userId);
			//mjonEventVO.setEventStatus("Y");
			MjonEventVO eventMberInfo = mjonEventService.selectEventMsgMberDefaultInfo(mjonEventVO);
			
			long eventDiffDate = 0;
			float eventRemainCash = 0;
			boolean compareEndDate = false;
			if(eventMberInfo != null) {
				
				String eventEndDate = eventMberInfo.getEventEndDate();
				
				/**
				 * MJUtil.getCompareDate()
				 * 현재 날짜와 파라미터 전달 날짜를 비교
				 * 전달날짜를 지난경우 False를 리턴함.
				 * 현재날짜 이전 혹은 같은 날짜면 True를 리턴함.
				 * 
				 * */
				if(eventEndDate != null) {
					compareEndDate = MJUtil.getCompareDate(eventEndDate);
					eventRemainCash = (float) eventMberInfo.getEventRemainCash(); 
					
					//이벤트 종료 일자가 지난 경우, 이벤트 상태가 종료아 아니면 종료 처리 시킴
					//이벤트 남은 캐시가 단문 발송금액 7.5원 보다 낮으면 이벤트 종료 시킴
					if(!compareEndDate  || eventRemainCash < 7.5) {
						
						if(!eventMberInfo.getEventStatus().equals("E")) {
							
							//이벤트 상태값을 종료로 변경한다.
							mjonEventVO.setEventInfoId(eventMberInfo.getEventInfoId());
							mjonEventVO.setEventStatus("E");
							mjonEventVO.setEventRemainCash(eventRemainCash);
							mjonEventService.updateEventEndStatus(mjonEventVO);
							eventMberInfo.setEventStatus("E");
						}
						
					}else {//이벤트 진행중이면 남은 날짜 계산해서 전달.
						
						eventDiffDate = MJUtil.getDiffDateDay(eventEndDate);
						
					}
				}
				
			}
			
			//남은 날짜값을 절대값으로 변경(음수로 나오기 때문)
			model.addAttribute("eventDiffDate", Math.abs(eventDiffDate));
			model.addAttribute("compareEndDate", compareEndDate);
			model.addAttribute("eventMberInfo", eventMberInfo);
			
			//1.시스템 기본 단가 정보 불러오기
			JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo();
			
			//2.사용자 개인 단가 정보 불러오기
			MberManageVO mberManageVO = new MberManageVO(); 
			if(!userId.equals("") && !author.equals("ROLE_ADMIN")) {
				
				mberManageVO = mjonMsgDataService.selectMberManageInfo(userId);
				
			}
			
			Float shortPrice = (float) mberManageVO.getShortPrice();
			Float longPrice = (float) mberManageVO.getLongPrice();
			Float picturePrice = (float) mberManageVO.getPicturePrice();
			Float picture2Price = (float) mberManageVO.getPicture2Price();
			Float picture3Price = (float) mberManageVO.getPicture3Price();
			
			Float kakaoAtPrice = (float) mberManageVO.getKakaoAtPrice();
			Float faxPrice = (float) mberManageVO.getFaxPrice();
			
			
			int userMoney = (int) mberManageVO.getUserMoney();
			String userPoint = mberManageVO.getUserPoint();
			
			if(shortPrice < 1 || longPrice < 1 || picturePrice < 1 || kakaoAtPrice < 1 || faxPrice < 1) {
				
				shortPrice = (float) sysJoinSetVO.getShortPrice();
				longPrice = (float) sysJoinSetVO.getLongPrice();
				picturePrice = (float) sysJoinSetVO.getPicturePrice();
				picture2Price = (float) sysJoinSetVO.getPicture2Price();
				picture3Price = (float) sysJoinSetVO.getPicture3Price();
				kakaoAtPrice = (float) sysJoinSetVO.getKakaoAtPrice();
				faxPrice = (float) sysJoinSetVO.getFaxPrice();
			}
			
			model.addAttribute("shortPrice", shortPrice);
			model.addAttribute("longPrice", longPrice);
			model.addAttribute("picturePrice", picturePrice);
			model.addAttribute("picture2Price", picture2Price);
			model.addAttribute("picture3Price", picture3Price);
			model.addAttribute("kakaoAtPrice", kakaoAtPrice);
			model.addAttribute("faxPrice", faxPrice);
			
			model.addAttribute("userMoney", userMoney);
			model.addAttribute("userPoint", userPoint);
			model.addAttribute("mberManageVO", mberManageVO);
		}
		
		{//캐시 정보
			List<MjonPayVO> cashInfoList = mjonPayService.selectCashInfoList(userId);
			model.addAttribute("cashInfoList", cashInfoList);
		}
		
		{//포인트 정보
			List<MjonPayVO> pointInfoList = mjonPayService.selectPointInfoList(userId);
			model.addAttribute("pointInfoList", pointInfoList);
		}
		MjonMsgVO mjonMsgVO = new MjonMsgVO();
		mjonMsgVO.setUserId(userId);
		
		{ // 발송건수
			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);
		}
		
		
		
		{// 충전캐시
			String sumPayMoney = mjonPayService.selectSumPayMoney(userId); 
			model.addAttribute("sumPayMoney", sumPayMoney);
		}
		
		{// 충전포인트
			String sumPoint = mjonPayService.selectSumPoint(userId); 
			model.addAttribute("sumPoint", sumPoint);
		}
		
		{// 총 사용금액
			MjonPayVO mjonPayVO = new MjonPayVO();
			mjonPayVO.setUserId(userId);
			List<MjonPayVO>  usedCashTotList = mjonPayService.selectUsedCashWithKakaoTotCnt(mjonPayVO);	
			model.addAttribute("usedCashTotList", usedCashTotList);
		}
		
		{// 사용가능한 금액
			MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(userId);
			model.addAttribute("mberManageVO", mberManageVO);
		}
		
		
		{//발신번호 리스트 조회하기
			MjPhoneMemberVO phoneMemberVO = new MjPhoneMemberVO();
			phoneMemberVO.setUserId(userId);
			phoneMemberVO.setSearchSortCnd("phmId");
			phoneMemberVO.setSearchSortOrd("desc");
			phoneMemberVO.setPhmType("01");//발신번호 타입의 번호만 조회
			phoneMemberVO.setFirstIndex(0);//페이징 처리에서 값이 없으면 1이 넘어가서 데이터를 못불러 오는 오류가 있어서 0으로 셋팅.
			List<MjPhoneMemberVO> sendNumberList = mjonMsgService.selectSendNumberList(phoneMemberVO);
			MJUtil mjUtil = new MJUtil();
			
			for(int i=0; i < sendNumberList.size(); i++) {
				String phoneNumber = mjUtil.addDash(sendNumberList.get(i).getPhoneNumber());
				sendNumberList.get(i).setPhoneNumber(phoneNumber);
			}
			int countNum = sendNumberList.size() > 0 ? sendNumberList.get(0).getTotCnt() : 0;
			
			model.addAttribute("countNum", countNum);
			model.addAttribute("sendNumberList", sendNumberList);
		}
		
		{//최근 발송 문자 내용 불러오기 - 최근 3개 내역만
			List<MjonMsgSentVO> mjonMsgSentList = mberManageService.selectMberMsgSentLatestList(userId);
			model.addAttribute("mjonMsgSentList", mjonMsgSentList);
		}
		
		{//최근 발송 알림톡 내용 불러오기 - 최근 3개 내역만
			KakaoSentVO kakaoSentVO = new KakaoSentVO();
			kakaoSentVO.setUserId(userId);
			kakaoSentVO.setTabType("at");
			kakaoSentVO.setRecordCountPerPage(3);
			kakaoSentVO.setFirstIndex(0);
			kakaoSentVO.setListType("groupList");
			kakaoSentVO.setStateType("all");
			kakaoSentVO.setSearchSortOrd("desc");
			kakaoSentVO.setSearchSortCnd("regdate");
			List<KakaoSentVO> kakaoATSentList = kakaoSentService.selectAllKakaoSentList(kakaoSentVO);
			model.addAttribute("kakaoATSentList", kakaoATSentList);
		}
		
		{//최근 발송 팩스 내용 불러오기 - 최근 3개 내역만
			FaxGroupDataVO faxGroupDataVO = new FaxGroupDataVO();
			faxGroupDataVO.setUserId(userId);
			faxGroupDataVO.setRecordCountPerPage(3);
			faxGroupDataVO.setFirstIndex(0);
			List<FaxGroupDataVO> faxSendList = faxService.selectMyFaxSendList(faxGroupDataVO);
			model.addAttribute("faxSendList", faxSendList);
		}
		
		model.addAttribute("pageTab", "myPageIndex");
		model.addAttribute("loginVO", loginVO);
		return "web/user/mberInfoIndex";
	}
	
	
	//발송문자 건수 계산하는 함수
	public String[] getTotalSendCnt(List<MjonMsgSentVO> mjonMsgSentVO) {
		
		int totCnt = 0;			//전체건수
		int succCnt = 0;		//성공건수
		int FCnt = 0;			//실패, 대기 건수
		int WCnt = 0;			//실패, 대기 건수
		int totalSPrice = 0;	//성공, 대기 금액 합산
		int totalWPrice = 0;	//성공, 대기 금액 합산
		int totalFPrice = 0;	//실패 금액 합산
		
		for(int i=0; i< mjonMsgSentVO.size(); i++) {
			
			String msgResultSts = mjonMsgSentVO.get(i).getMsgResultSts();
			int msgResultCnt = Integer.parseInt(mjonMsgSentVO.get(i).getMsgResultCnt());
			float msgEachPrice = Float.parseFloat(mjonMsgSentVO.get(i).getEachPrice());
					
			
			if(msgResultSts.equals("S")) {
				succCnt = succCnt + msgResultCnt;
				totalSPrice = totalSPrice + (int)(msgResultCnt * msgEachPrice);
			}else if(msgResultSts.equals("W")){
				WCnt = WCnt + msgResultCnt;
				totalWPrice = totalWPrice + (int)(msgResultCnt * msgEachPrice);
			}else {
				FCnt = FCnt + msgResultCnt;
				totalFPrice = totalFPrice + (int)(msgResultCnt * msgEachPrice);
			}
			
			totCnt = totCnt + msgResultCnt;
			
		}
		
		String[] returnArr = {Integer.toString(totCnt), Integer.toString(succCnt), Integer.toString(WCnt), Integer.toString(FCnt), Integer.toString(totalSPrice), Integer.toString(totalWPrice), Integer.toString(totalFPrice)}; 
		return returnArr;
	}
	
	/**
	 * 마이페이지 비밀번호 변경 탭
	 */
	@RequestMapping(value="/web/user/mberInfoChange.do")
	public String mberInfoChange(
		@ModelAttribute MberManageVO mberManageVO
		, ModelMap model
		, RedirectAttributes redirectAttributes) 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";
		}
		model.addAttribute("loginVO", loginVO);
		
		
		mberManageVO.setMberId(loginVO.getId());
		MberManageVO userInfo = userManageService.selectUserInfo(mberManageVO);
		model.addAttribute("userInfo", userInfo);
		
		/*if(!userInfo.getAtchFileId().equals("")) {*/
		//사업자등록증
		if(!("").equals(userInfo.getAtchFileId())) {
			
			FileVO fileVO = new FileVO();
			fileVO.setAtchFileId(userInfo.getAtchFileId());
			List<FileVO> result = fileService.selectFileInfs(fileVO);
			model.addAttribute("result", result);
		}
		//재직증명서
		if(!("").equals(userInfo.getWorkAtchFileId())) {
			
			FileVO fileVO = new FileVO();
			fileVO.setAtchFileId(userInfo.getWorkAtchFileId());
			List<FileVO> result2 = fileService.selectFileInfs(fileVO);
			model.addAttribute("result2", result2);
		}
		
		// 이메일 코드조회
		ComDefaultCodeVO voComCode = new ComDefaultCodeVO();
		voComCode.setCodeId("ITN031");
		model.addAttribute("emailCode", cmmUseService.selectCmmCodeDetail(voComCode));
		
		model.addAttribute("pageTab", "mberInfoChange");
		
		
		if("c".equals(userInfo.getDept())) { //기업회원
			//기업회원 정보변경 신청 상태 확인 - 회원ID로 가장 최근 기업회원 정보 내역 조회
			mberManageVO.setSearchHstType("04"); //담당자 변경 조회
			MberManageVO cmpPhoneChangeManageVO = mberManageService.selectCmpUsrHst(mberManageVO);
			model.addAttribute("cmpPhoneChangeManageVO", cmpPhoneChangeManageVO);
			mberManageVO.setSearchHstType("03"); //사업장 변경 조회
			MberManageVO cmpInfoChangeManageVO = mberManageService.selectCmpUsrHst(mberManageVO);
			model.addAttribute("cmpInfoChangeManageVO", cmpInfoChangeManageVO);
			return "web/user/mberCompanyInfoChange"; 
		}
		return "web/user/mberInfoChange";//개인회원
		
	}
	
	// 회원가입 - 모바일인증 중복 체크 Ajax, 만 18세 체크
	@RequestMapping(value = "/web/user/mblDnCheckByIdAjax.do")
	public ModelAndView selectMblDnCheckByIdAjax(@ModelAttribute("mberManageVO") MberManageVO mberManageVO,
			@RequestParam Map<String, Object> commandMap) throws Exception {

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

		//중복체크
//		String mblDn = (String) commandMap.get("mblDn");
		String Id = (String) commandMap.get("id");
		mberManageVO.setMberId(Id);

		List<String> checkMblDn = new ArrayList<String>();
		checkMblDn = mberManageService.selectMblDnCheckById(mberManageVO);

		modelAndView.addObject("checkMblDnCnt", checkMblDn.size());
		
		//만 나이
		String birthDay = (String) commandMap.get("birthDay");
		LocalDate now = LocalDate.now();
		LocalDate parsedBirthDate = LocalDate.parse(birthDay, DateTimeFormatter.ofPattern("yyyyMMdd"));
	 
		int age = now.minusYears(parsedBirthDate.getYear()).getYear(); // (1)
	 
		if (parsedBirthDate.plusYears(age).isAfter(now)) { 
			age = age -1;
		}
		modelAndView.addObject("age", age);
		
		return modelAndView;
	}	
	
	/**
	* 회원정보 조회 휴대폰 인증  
	*/
	@RequestMapping("/web/user/selectKmcMberInfoAjax.do")
	public String selectKmcMberInfoAjax(
		HttpServletRequest request, ModelMap model  
		, @RequestParam Map<String, Object> commandMap
		, @ModelAttribute("searchVO") KmcVO kmcVO ) throws Exception {
			
		//개인회원일 시 mblDn 비교 후 본인 명의 휴대폰만 변경 가능하게끔
		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
		String mblDn = userManageService.selectUserMblDnById(loginVO.getId());
		model.addAttribute("loginVO", loginVO);
		
		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) ;
			}
		}
		
		
		//KMC 본인인증 로그
		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);
		
		//개인회원일 시 기존 DN가 본인인증 DN비고하여 본인 명의만 번호 변경 가능하게
		if("p".equals(loginVO.getDept())) {
			if(!mblDn.equals(DI)) {
				kmcVO.setDnChk("N");
			}
		}
		
		//LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
	//	model.addAttribute("loginVO", loginVO);
		
		model.addAttribute("kmcVO", kmcVO);
		
		return "web/user/mberInfoKmcReqPage";
	}
	
	
	/**
	 * 마이페이지 개인정보 변경
	 */
	@RequestMapping(value="/web/user/updateUserInfoAjax.do")
	public ModelAndView updateUserInfoAjax(@ModelAttribute MberManageVO mberManageVO
	, HttpServletRequest request
	, HttpServletResponse response
	, final MultipartHttpServletRequest multiRequest) throws Exception {
			ModelAndView modelAndView = new ModelAndView();
			modelAndView.setViewName("jsonView");
		try {
			userManageService.updateUserInfo(mberManageVO); //이메일, 이벤트 수신 여부와 개인회원의 휴대폰 변경 시 회원 테이블 update
			if("c".equals(mberManageVO.getDept()) && "Y".equals(mberManageVO.getMoblphonNoChangeYn())) { //기업회원의 휴대폰 변경 시 기업 회원 히스토리 테이블에 insert 후 관리자의 승인 반려 처리
				
				String cAtchFileId = mberManageVO.getWorkAtchFileId();
				final Map<String, MultipartFile> files = multiRequest.getFileMap();
				Map<String, MultipartFile> fileW = new LinkedHashMap<>(); //재직증명서
				if (!files.isEmpty()){
					Iterator<Map.Entry<String, MultipartFile>> it = files.entrySet().iterator();
					int cIndex = 0;
					int wIndex = 0;
					while(it.hasNext()) {
						
						Map.Entry<String, MultipartFile> entry = it.next();
						MultipartFile mFile = entry.getValue();
						
						if(entry.getKey().equals("fileWork")) {	//재직증명서 - jsp에서 넘겨준 input type="file"의 name
							
							fileW.put("fileW" + wIndex, mFile);
							wIndex++;
							
						}
						
					}
					
					if(fileW != null) { // 재직증명서 첨부파일
						
						List<FileVO> resultW = fileUtil.parseFileInf(fileW, "WORK_", 0, "", "", "");
						cAtchFileId = fileMngService.insertFileInfs(resultW);
						mberManageVO.setWorkAtchFileId(cAtchFileId);
						
					}
				}				
				mberManageVO.setHstType("04"); //유형 1.회원가입 2.기업회원전환 3.기업정보변경 4.기업회원 담당자 변경(공통코드)
				mberManageVO.setHstSttus("01"); //상태 1.신청 2.승인 3.반려 (공통코드)
				LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
				mberManageVO.setUniqId( user.getUniqId());
				mberManageVO.setAtchFileId(""); //담당자변경은 사업자등록증 첨부X
				//회원정보 조회해서 histy에 insert에 추가
				MberManageVO userInfo = userManageService.selectUserInfo(mberManageVO);
					mberManageVO.setBizType(userInfo.getBizType());
					mberManageVO.setMberNm(userInfo.getMberNm());
					mberManageVO.setBizNo(userInfo.getBizNo());
					mberManageVO.setCeoNm(userInfo.getCeoNm());
			
				
				mberManageService.insertCmpUsrHst(mberManageVO);
			}
			
			modelAndView.addObject("result", "success");
		}catch (Exception e) {
			modelAndView.addObject("message", "다시 시도 부탁드립니다.");
			modelAndView.addObject("result", "fail");
		} 
		return modelAndView;
	}
	
	/**
	 * 마이페이지 기업정보 변경
	 */
	@RequestMapping(value="/web/user/updateCmpUserInfoAjax.do")
	public ModelAndView updateCmpUserInfoAjax(@ModelAttribute MberManageVO mberManageVO
			, HttpServletRequest request
			, HttpServletResponse response
			, final MultipartHttpServletRequest multiRequest) throws Exception {
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		try {
			String wAtchFileId = mberManageVO.getAtchFileId();
			String cAtchFileId = mberManageVO.getWorkAtchFileId();
			final Map<String, MultipartFile> files = multiRequest.getFileMap();
			Map<String, MultipartFile> fileC = new LinkedHashMap<>(); //사업자등록증 
			Map<String, MultipartFile> fileW = new LinkedHashMap<>(); //재직증명서
			if (!files.isEmpty()){
				Iterator<Map.Entry<String, MultipartFile>> it = files.entrySet().iterator();
				int cIndex = 0;
				int wIndex = 0;
				while(it.hasNext()) {
					
					Map.Entry<String, MultipartFile> entry = it.next();
					MultipartFile mFile = entry.getValue();
					
					if(entry.getKey().equals("file")) {	//사업자등록증 - jsp에서 넘겨준 input type="file"의 name
						
						fileC.put("fileC" + cIndex, mFile);
						cIndex++;
						
					}
					
					if(entry.getKey().equals("fileWork")) {	//재직증명서 - jsp에서 넘겨준 input type="file"의 name
						
						fileW.put("fileW" + wIndex, mFile);
						wIndex++;
						
					}
					
				}
				
				if(fileC != null) { // 사업자등록증
					
					List<FileVO> resultC = fileUtil.parseFileInf(fileC, "BIZ_", 0, "", "", "");
					wAtchFileId = fileMngService.insertFileInfs(resultC);
					mberManageVO.setAtchFileId(wAtchFileId);
					
				}
				
				if(fileW != null) { // 재직증명서 첨부파일
					
					List<FileVO> resultW = fileUtil.parseFileInf(fileW, "WORK_", 0, "", "", "");
					cAtchFileId = fileMngService.insertFileInfs(resultW);
					mberManageVO.setWorkAtchFileId(cAtchFileId);
					
				}
			}
			
			mberManageVO.setHstType("03"); //유형 1.회원가입 2.기업회원전환 3.기업정보변경 (공통코드)
			mberManageVO.setHstSttus("01"); //상태 1.신청 2.승인 3.반려 (공통코드)
			LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
			mberManageVO.setUniqId( user.getUniqId());
			MberManageVO userInfo = userManageService.selectUserInfo(mberManageVO);
			
			//회원정보 조회해서 histy에 insert에 추가
			mberManageVO.setManagerNm(userInfo.getManagerNm());
			mberManageVO.setMoblphonNo(userInfo.getMoblphonNo());
			
			mberManageService.insertCmpUsrHst(mberManageVO);
			
			modelAndView.addObject("result", "success");
			
		}catch (Exception e) {
			modelAndView.addObject("message", "다시 시도 부탁드립니다.");
			modelAndView.addObject("result", "fail");
		} 
		return modelAndView;
	}
/*	*//**
	 * 마이페이지 기업정보 변경
	 *//*
	@RequestMapping(value="/web/user/updateCmpUserInfoAjax.do")
	public ModelAndView updateCmpUserInfoAjax(@ModelAttribute MberManageVO mberManageVO
			, HttpServletRequest request
			, HttpServletResponse response
			, final MultipartHttpServletRequest multiRequest) throws Exception {
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		try {
			String atchFileId = mberManageVO.getAtchFileId();
			String isThumbFile = "";
			final Map<String, MultipartFile> files = multiRequest.getFileMap();
			if (!files.isEmpty()){
				if ("".equals(atchFileId)) {
					List<FileVO> result = fileUtil.parseFileInf(files, "MY_", 0, atchFileId , "", isThumbFile);
					atchFileId = fileMngService.insertFileInfs(result);
					mberManageVO.setAtchFileId(atchFileId);
				}else {
					FileVO fvo = new FileVO();
					fvo.setAtchFileId(atchFileId);
					int cnt = fileMngService.getMaxFileSN(fvo);
					List<FileVO> result = fileUtil.parseFileInf(files, "MY_", cnt, atchFileId, "", isThumbFile);
					fileMngService.updateFileInfs(result);
				}
			}
			userManageService.updateUserInfo(mberManageVO);
			modelAndView.addObject("result", "success");
		}catch (Exception e) {
			modelAndView.addObject("message", "다시 시도 부탁드립니다.");
			modelAndView.addObject("result", "fail");
		} 
		return modelAndView;
	}
*/	
	
	/**
	 * 기업회원 전환
	 */
	@RequestMapping(value="/web/user/membershipChange.do")
	public String membershipChange(ModelMap model) throws Exception {
		/*LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();*/
		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
		
		if(loginVO == null) {
			return "redirect:/web/user/login/login.do";
		}
		model.addAttribute("loginVO", loginVO);
		
		// 이메일 코드조회
		ComDefaultCodeVO voComCode = new ComDefaultCodeVO();
		voComCode.setCodeId("ITN031");
		model.addAttribute("emailCode", cmmUseService.selectCmmCodeDetail(voComCode));
		model.addAttribute("pageTab", "membershipChange");
		
		//기업회원전환 신청 상태 확인 - 회원ID로 가장 최근 기업회원 정보 내역 조회
		MberManageVO mberManageVO = new MberManageVO();
		mberManageVO.setMberId(loginVO.getId());					
		MberManageVO cmpChangeManageVO = mberManageService.selectCmpUsrHst(mberManageVO);
		if(null != cmpChangeManageVO) {
			if("02".equals(cmpChangeManageVO.getHstType())) { //가장 마지막 내역이 기업회원전환일 시
				if("01".equals(cmpChangeManageVO.getHstSttus())) { //가장 마지막 기업회원전환이 신청 상태일 시
					model.addAttribute("cmpChangeManageVO", cmpChangeManageVO);
					return "web/user/membershipChanging";
				}else if("03".equals(cmpChangeManageVO.getHstSttus())) { //가장 마지막 기업회원전환이 반려 상태일 시
					model.addAttribute("cmpChangeManageVO", cmpChangeManageVO);
					return "web/user/membershipChangeReturn";
				}
				
			}
		}
		
		return "web/user/membershipChange";
	}
	
	/**
	 * 기업회원 전환 변경
	 */
	@RequestMapping(value="/web/user/updateMembershipChangeAjax.do")
	public ModelAndView updateMembershipChangeAjax(@ModelAttribute MberManageVO mberManageVO
		, HttpServletRequest request
		, HttpServletResponse response
		, final MultipartHttpServletRequest multiRequest) throws Exception {
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		
		if("Y".equals(mberManageVO.getAtchFileSttus())) { //사업자등록증 문제 없을 시 - 재직증명서만 새로 제출하며 사업자등록증은 기존에 첨부파일 ID를 사용
			mberManageVO.setAtchFileId(mberManageVO.getBeforeAtchFileId());
		}
		
		if("Y".equals(mberManageVO.getWorkAtchFileSttus())) { //재직증명서 문제 없을 시 - 사업자등록증 새로 제출하며 재직증명서는 기존에 첨부파일 ID를 사용
			mberManageVO.setWorkAtchFileId(mberManageVO.getBeforeWorkAtchFileId());
		}
		
		try {
			
			String wAtchFileId = mberManageVO.getAtchFileId();
			String cAtchFileId = mberManageVO.getWorkAtchFileId();
			final Map<String, MultipartFile> files = multiRequest.getFileMap();
			Map<String, MultipartFile> fileC = new LinkedHashMap<>(); //사업자등록증 
			Map<String, MultipartFile> fileW = new LinkedHashMap<>(); //재직증명서
			if (!files.isEmpty()){
				Iterator<Map.Entry<String, MultipartFile>> it = files.entrySet().iterator();
				int cIndex = 0;
				int wIndex = 0;
				while(it.hasNext()) {
					
					Map.Entry<String, MultipartFile> entry = it.next();
					MultipartFile mFile = entry.getValue();
					
					if(entry.getKey().equals("file")) {	//사업자등록증 - jsp에서 넘겨준 input type="file"의 name
						
						fileC.put("fileC" + cIndex, mFile);
						cIndex++;
						
					}
					
					if(entry.getKey().equals("fileWork")) {	//재직증명서 - jsp에서 넘겨준 input type="file"의 name
						
						fileW.put("fileW" + wIndex, mFile);
						wIndex++;
						
					}
					
				}
				
				if(fileC.size() > 0) { // 사업자등록증
					
					List<FileVO> resultC = fileUtil.parseFileInf(fileC, "BIZ_", 0, "", "", "");
					wAtchFileId = fileMngService.insertFileInfs(resultC);
					mberManageVO.setAtchFileId(wAtchFileId);
					
				}
				
				if(fileW.size() > 0) { // 재직증명서 첨부파일
					
					List<FileVO> resultW = fileUtil.parseFileInf(fileW, "WORK_", 0, "", "", "");
					cAtchFileId = fileMngService.insertFileInfs(resultW);
					mberManageVO.setWorkAtchFileId(cAtchFileId);
					
				}
			}
			
			//디비 테이블에 저장하기
			//22.05.11 - 회원테이블 update에서 기업회원 히스토리 테이블 insert로 수정
			//관리자가 승인 시 기업회원 히스토리 테이블의 데이터로 회원테이블 update
			//mberManageService.updateMembershipChange(mberManageVO);
			mberManageVO.setHstType("02"); //유형 1.회원가입 2.기업회원전환 3.기업정보변경 (공통코드)
			mberManageVO.setHstSttus("01"); //상태 1.신청 2.승인 3.반려 (공통코드)
			LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
			mberManageVO.setUniqId( user.getUniqId());
			
			//기업회원 전환 시 휴대폰을 따로 입력 받지 않아, 회원 테이블의 전화번호 조회 후 설정
			MberManageVO mberManageVO2 = mberManageService.selectMber(user.getId());
			mberManageVO.setMoblphonNo(mberManageVO2.getMoblphonNo());
			
			mberManageService.insertCmpUsrHst(mberManageVO);
			
			// 법인폰 알람여부 체크
			JoinSettingVO joinSettingVO = new JoinSettingVO();
			joinSettingVO = egovSiteManagerService.selectAdminNotiDetail();
			// 이메일 체크
			if (joinSettingVO != null && joinSettingVO.getEmailNoti().equals("Y")) {
				String emailTitle = "회원관리 > 기업회원 전환승인 요청";
				
				// CS관리자 이메일 알림전송
				mjonNoticeSendUtil.csAdminEmailNoticeSend(mberManageVO.getMberNm(), mberManageVO.getMberId(), emailTitle);
			}

			// SMS 체크			
			if (joinSettingVO != null && joinSettingVO.getSmsNoti().equals("Y")) {
				String smsTitle = "기업회원 전환승인 요청";
				
				// CS관리자 SMS 알림전송
				mjonNoticeSendUtil.csAdminSmsNoticeSend(mberManageVO.getMberId(), smsTitle);				
			}

			// SLACK 체크
			if (joinSettingVO != null && joinSettingVO.getSlackNoti().equals("Y")) {			
				// Slack 메시지 발송(단순본문)
				String msg = "[문자온] 기업회원 전환승인 요청 - " + mberManageVO.getMberNm() +"("+ mberManageVO.getMberId() + ")";
				mjonCommon.sendSimpleSlackMsg(msg);
			}
			
			modelAndView.addObject("result", "success");
			
		}catch (Exception e) {
			modelAndView.addObject("message", "다시 시도 부탁드립니다.");
			modelAndView.addObject("result", "fail");
		} 
		return modelAndView;
	}
	
	
	/**
	 * 비밀번호 변경 페이지
	 */
	@RequestMapping(value="/web/user/passwordChange.do")
	public String passwordChange(ModelMap model)
	throws Exception {
		/*LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();*/
		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
		
		if(loginVO == null) {
			return "redirect:/web/user/login/login.do";
		}
		model.addAttribute("loginVO", loginVO);
		
		model.addAttribute("pageTab", "passwordChange");
		return "web/user/passwordChange";
	}
	
	/**
	 * 기존 비밀번호 조회
	 */
	@RequestMapping(value="/web/user/selectPasswordCheckAjax.do")
	public ModelAndView selectPasswordCheckAjax(@ModelAttribute UserManageVO userManageVO
		, HttpServletRequest request
		,HttpServletResponse response) throws Exception {
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		try {
			LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
			userManageVO.setUniqId(loginVO.getId());
			int pwCheck = mberManageService.selectPasswordCheck(userManageVO);
			
			modelAndView.addObject("pwCheck", pwCheck);
			modelAndView.addObject("result", "success");
			
			// 요청페이지가 개인정보 변경 펴이지 일경우
			if(userManageVO.getUserTy().equals("userInfoCh")){
				//System.out.println("휴대폰 인증 ***********************************************");
				KmcCertChecker kmcCertCheck = new KmcCertChecker();
				
				//kmc 본인인증 실/개발 서버 구분
				String serverNm = "";
				if(request.getServerName().contains("219.240.88.15") || request.getServerName().contains("localhost")) {
					serverNm = request.getScheme() + "://219.240.88.15:8095";
				}else{
					serverNm = request.getScheme() + "://www.munjaon.co.kr";
				}
				
				AuthCertVO certVO = kmcCertCheck.authCertCheckFive(serverNm + "/web/user/selectKmcMberInfoAjax.do", loginVO.getId());
				modelAndView.addObject("certVO", certVO);
			}
			
		}catch (Exception e){
			modelAndView.addObject("message", "다시 시도 부탁드립니다.");
			modelAndView.addObject("result", "fail");
		}
		return modelAndView;
	}
	
	/**
	 * 비밀번호 변경
	 */
	@RequestMapping(value="/web/user/updatePasswordCheckAjax.do")
	public ModelAndView updatePasswordCheckAjax(@ModelAttribute UserManageVO userManageVO
		, HttpServletRequest request
		,HttpServletResponse response) throws Exception {
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
			
		try {
			
			LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
			
			UserManageVO userCheckVO = new UserManageVO();
			userCheckVO.setUniqId(loginVO.getId());
			userCheckVO.setPassword(userManageVO.getOldPassword());
			int pwCheck = mberManageService.selectPasswordCheck(userCheckVO);
			if(pwCheck == 0) {
				modelAndView.addObject("errType", "01");
				modelAndView.addObject("message", "현재 비밀번호를 확인해 주세요");
				modelAndView.addObject("result", "fail");
				return modelAndView;
			}
			
			if(!userManageVO.getPassword().equals(userManageVO.getRsaPasswd())) {
				modelAndView.addObject("errType", "02");
				modelAndView.addObject("message", "새 비밀번호와 확인 비밀번호가 같지 않습니다.");
				modelAndView.addObject("result", "fail");
				return modelAndView;
			}
			
			// 해당 정보의 등록 페스워드 조회
			userManageVO.setEmplyrId(loginVO.getId());
			int beforePwCheck = mberManageService.selectMberPWOverlapCheck(userManageVO);
			if (beforePwCheck != 0) {
				modelAndView.addObject("errType", "03");
				modelAndView.addObject("message", "사용한 적 있는 비밀번호 입니다. 다른 비밀번호를 입력해주세요.");
				modelAndView.addObject("result", "fail");
				return modelAndView;
			}
			
			userManageVO.setEmplyrId(loginVO.getId());
			userManageService.updateUserPWAjax(userManageVO);
			modelAndView.addObject("result", "success");
			
		}catch (Exception e) {
			modelAndView.addObject("message", "Error : " + e.getLocalizedMessage());
			modelAndView.addObject("result", "fail");
		}
		
		return modelAndView;
	}
	
	/**
	 * 신규 발신번호 관리 등록
	 */
	@RequestMapping(value="/web/user/sendNumberManageRegister.do")
	public String sendNumberManageRegister(
		@ModelAttribute MberManageVO mberManageVO
		, HttpServletRequest request
		, ModelMap model) throws Exception {
		/*LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();*/
		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
		
		if(loginVO == null) {
			return "redirect:/web/user/login/login.do";
		}
		model.addAttribute("loginVO", loginVO);
		model.addAttribute("pageTab", "sendNumberManage");
		
		mberManageVO.setMberId(loginVO.getId());
		MberManageVO userInfo = userManageService.selectUserInfo(mberManageVO);
		model.addAttribute("userInfo", userInfo);
		
		
		return "web/user/sendNumberManageRegister";
	}
	
	/**
	 * 발신번호 관리
	 */
	@RequestMapping(value="/web/user/sendNumberManage.do")
	public String sendNumberManage(
		@ModelAttribute MberManageVO mberManageVO
		, HttpServletRequest request
		, ModelMap model, RedirectAttributes redirectAttributes) throws Exception {
		/*LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();*/
		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
		
		if(loginVO == null) {
			/*model.addAttribute("message", "문자온 서비스는 로그인 후 이용 가능합니다.");*/
			//redirectAttributes.addFlashAttribute("message", "문자온 서비스는 로그인 후 이용 가능합니다.");
			return "redirect:/web/user/login/login.do";
		}
		model.addAttribute("loginVO", loginVO);
		model.addAttribute("pageTab", "sendNumberManage");
		
		mberManageVO.setMberId(loginVO.getId());
		MberManageVO userInfo = userManageService.selectUserInfo(mberManageVO);
		model.addAttribute("userInfo", userInfo);
		
		
		return "web/user/sendNumberManage";
	}
	
	/**
	 * 발신번호 리스트 Ajax
	 */
	@RequestMapping(value="/web/user/sendNumberListAjax.do")
	public String sendNumberListAjax(
		@ModelAttribute("searchVO") MjPhoneMemberVO searchVO
		, HttpServletRequest request
		, ModelMap model) throws Exception {
		LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
	
		searchVO.setPhmType("01"); //발신조회
		searchVO.setUserId(userId);
		searchVO.setFirstIndex(0);
		searchVO.setRecordCountPerPage(1000);
		
		if("".equals(searchVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
			searchVO.setSearchSortCnd("phmId");
			searchVO.setSearchSortOrd("desc");
		}
		
		if(!"".equals(searchVO.getSearchKeyword())) {
			searchVO.setSearchKeyword(searchVO.getSearchKeyword().replaceAll("-", ""));
		}
		
		//발신번호 리스트 조회
		searchVO.setPhmType("01"); //발신조회
		List<MjPhoneMemberVO> sendNumberList = mjonMsgService.selectSendNumberList(searchVO);
		MJUtil mjUtil = new MJUtil();
		
		int rejectCnt = 0;	//발신번호 반려 건수 
		int compCnt = 0; //인증완료 건수
		for(int i=0; i < sendNumberList.size(); i++) {
			String phoneNumber = mjUtil.addDash(sendNumberList.get(i).getPhoneNumber());
			sendNumberList.get(i).setPhoneNumber(phoneNumber);
			
			//발신번호 반려 건수 체크
			if(sendNumberList.get(i).getAuthYn().equals("C")) {
				rejectCnt++;
			}
			
			if(sendNumberList.get(i).getAuthYn().equals("Y")) {
				compCnt++;
			}
		}
		int countNum = sendNumberList.size() > 0 ? sendNumberList.get(0).getTotCnt() : 0;
		
		model.addAttribute("countNum", countNum);
		model.addAttribute("sendNumberList", sendNumberList);
		model.addAttribute("rejectCnt", rejectCnt);
		model.addAttribute("compCnt", compCnt);
		
		return "web/user/sendNumberListAjax";
	}

	/**
	* 발신번호 등록 여부 확인
	*/
	@RequestMapping(value = "/web/user/updateSendNumberAjax.do")
	public ModelAndView updateSendNumberAjax(
		@ModelAttribute("searchVO") MjPhoneMemberVO mjPhoneMemberVO
		, HttpServletRequest request
		,HttpServletResponse response
		,final MultipartHttpServletRequest multiRequest) throws Exception {
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		
		int resultCnt = 0;
		MjPhoneMemberVO resultPhoneInfo = new MjPhoneMemberVO();
		try {
			
			LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
			String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
			
			mjPhoneMemberVO.setUserId(userId);
			
			String atchFileId = "";
			String isThumbFile = "";
			String phmId = mjPhoneMemberVO.getPhmId();
			String certId = "";
			
			//회원 발신번호 정보 불러오기
			resultPhoneInfo = mjonMsgService.selectSendPhoneNumberByPhmId(phmId);
			
			final Map<String, MultipartFile> files = multiRequest.getFileMap();
			if (!files.isEmpty()){
				
				atchFileId = mjPhoneMemberVO.getAtchFileId();
				
				if ("".equals(atchFileId)) {//신규 첨부파일 처리
					List<FileVO> result = fileUtil.parseFileInf(files, "CERT_", 0, atchFileId, "", "");
					atchFileId = fileMngService.insertFileInfs(result);
					
					//resultPhoneInfo = mjonMsgService.selectSendPhoneNumberByPhmId(phmId);
					
					//인증서류 데이터 입력하기
					CertVO certVO = new CertVO();
					certId = egovCertEtcIdGnrService.getNextStringId();
					mjPhoneMemberVO.setCertId(certId);
					certVO.setCertId(certId);	//인증 파일 아이디
					certVO.setSentPhoneNumber(resultPhoneInfo.getPhoneNumber());	//발신번호
					certVO.setCertType("01");										//인증종류 : 발신 타입(01)
					certVO.setAtchFileId(atchFileId);								//첨부파일 아이디
					certVO.setUserId(loginVO.getId());								//사용자 아이디
					certVO.setFrstRegisterId(loginVO.getId());						//최초등록자
					certService.insertCertFile(certVO);
					
				} else {//기존 첨부파일 업데이트
					FileVO fvo = new FileVO();
					fvo.setAtchFileId(atchFileId);
					int cnt = fileMngService.getMaxFileSN(fvo);
					List<FileVO> result = fileUtil.parseFileInf(files, "CERT_", cnt, atchFileId, "", "");
					
					fileMngService.updateFileInfs(result);
				}
				
			}
			
			//발신번호 수정에 따른 상태값을 심사로 변경.
			resultCnt = mjonMsgService.updateSendPhoneNumberAuthType(mjPhoneMemberVO);

			if(resultCnt > 0) {
				
				/*String title = "번호관리 > 발신번호 재승인 요청";
				// CS관리자 이메일 알림전송
				mjonNoticeSendUtil.csAdminEmailNoticeSend(loginVO.getName(), loginVO.getId(), title);*/
				
				modelAndView.addObject("result", "success");
				modelAndView.addObject("message", "발신번호 수정 요청이 접수 되었습니다.");
				
 			}else {
				
				modelAndView.addObject("result", "fail");
				modelAndView.addObject("message", "발신번호 수정 요청 접수에 오류가 발생하였습니다.");
				
			}
			
		}catch (Exception e) {
			modelAndView.addObject("message", "다시 시도 부탁드립니다.");
			modelAndView.addObject("result", "fail");
			
			return modelAndView;
		} 
		
		/**
		 * 발신번호 등록시 반려후 재승인 심사가 필요한 경우
		 * 관리자에게 재승인 신청 접수 내역을 알리는 
		 * 메일 발송 및 문자 발송을 진행한다.
		 * 2022.09.26 우영두 수정
		 * 
		 * 에러가 발생시 오류 메세지만 로그 기록하고 완료 처리함
		 * */
		
		try {
			
			// 즉시승인이 아닌경우 문자온 법인폰으로 알림 문자 발송하기.
			if (resultCnt > 0) {
				String title = "번호관리 > 발신번호 재승인 요청";
				String userNm = resultPhoneInfo.getUserName();
				String userId = resultPhoneInfo.getUserId();
				String phoneNum = resultPhoneInfo.getPhoneNumber();				

				// 법인폰 알람여부 체크
				JoinSettingVO joinSettingVO = new JoinSettingVO();
				joinSettingVO = egovSiteManagerService.selectAdminNotiDetail();
				// 이메일 체크
				if (joinSettingVO != null && joinSettingVO.getEmailNoti().equals("Y")) {
					// CS관리자 이메일 알림전송
					mjonNoticeSendUtil.csAdminEmailNoticeSend(userNm, userId, title);
				}

				// SMS 체크				
				if (joinSettingVO != null && joinSettingVO.getSmsNoti().equals("Y")) {
					MjonCommon mjCommon = new MjonCommon();
					MjonMsgVO mjonMsgVO = new MjonMsgVO();
					
					//발신번호 등록(관리자에게 알림이기에 발신번호도 법인폰 번호로 한다. 01084329333 )
					mjonMsgVO.setCallFrom("01084329333");
					//발송 문자 내용 등록
					String smsTxt = "[발신번호 재승인 요청] "+ userNm +"(" + userId + ")/발신번호 " + phoneNum + "/재승인 요청";
					mjonMsgVO.setSmsTxt(smsTxt);
					
					//발송 문자 타입(단/장문) 등록
					//문자열 길이 체크 해주기
		        	String charset = "euc-kr"; 						//문자 바이트 계산에 필요한 캐릭터 셋 : 한글 2Byte로 계산
		        	
		        	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 resultCom = mjCommon.getAdminPhoneSendMsgDataComm(mjonMsgVO);
					
					//문자온 법인폰으로 문자 발송 처리
					mjonMsgDataService.insertAdmToMberMsgDataInfo(resultCom);					
				}				
				
				// SLACK 체크
				if (joinSettingVO != null && joinSettingVO.getSlackNoti().equals("Y")) {				
					// Slack 메시지 발송(단순본문)
					String msg = "[문자온] 발신번호 재승인 요청 - " + userNm +"("+ userId + ")";
					mjonCommon.sendSimpleSlackMsg(msg);
				}
			}
			
		} catch (Exception e) {
			System.out.println("+++++++++++++++++++++++++++++ 발신번호 등록 재승인 요청문자온 법인폰으로 문자 발송 및 이메일 알림 발송  Function Error !!!" + e);
		}
		
		
		return modelAndView;
	}
	
	
	/**
	* 발신번호 등록 여부 확인
	*/
	@RequestMapping(value = "/web/user/selectSendNumberAjax.do")
	public ModelAndView selectSendNumberAjax(
		@ModelAttribute("searchVO") MjonMsgVO mjonMsgVO
		, HttpServletRequest request
		,HttpServletResponse response) throws Exception {
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		try {
			
			//발신번호 차단 리스트 체크(아이디 상관없이 모든 번호에 대한 차단번호 체크 20220616)
			int sendBlockNumberCheck = 0;
			sendBlockNumberCheck = mjonMsgService.selectSendBlockPhonNumCheck(mjonMsgVO);
			
			if(sendBlockNumberCheck != 0){
				String message = "입력하신 발신번호는 차단된 발신번호 입니다.";
				modelAndView.addObject("message", message);	
				modelAndView.addObject("result", "fail");
				
				return modelAndView;
			}
			
			int sendNumberCheck = 0;
			//발신번호 등록 중복 체크
			sendNumberCheck = mjonMsgService.selectSendPhonNumCheck(mjonMsgVO);
			
			if(sendNumberCheck != 0) {
				String message = "이미 등록되어 있는 발신번호 입니다.";
				modelAndView.addObject("message", message);	
				modelAndView.addObject("result", "fail");
			}else {
				//System.out.println(mjonMsgVO.getPhmAuthType() + "  :  ***********************************************");
				//if(mjonMsgVO.getPhmAuthType().equals("01") || mjonMsgVO.getPhmAuthType() == "01") { // phone
					//System.out.println("휴대폰 인증 ***********************************************");
					LoginVO loginVO = new LoginVO(); 
					loginVO.setId(mjonMsgVO.getUserId());
					loginVO = loginService.selectKMCInfo(loginVO);
					modelAndView.addObject("loginVO", loginVO);
					
					
					mjonMsgVO.getCallFrom(); 	// 신규 등록할 발신번호
					String name = loginVO.getMberNm(); // 이름
					
					if(loginVO.getDept().equals("c")) {
						name = loginVO.getManagerNm();
					}
					
					KmcCertChecker kmcCertCheck = new KmcCertChecker();
					
					//kmc 본인인증 실/개발 서버 구분
					String serverNm = "";
					if(request.getServerName().contains("119.193.215.98") || request.getServerName().contains("localhost")) {
						serverNm = request.getScheme() + "://119.193.215.98:8882";
					}else{
						serverNm = request.getScheme() + "://www.munjaon.co.kr";
					}
					
					//AuthCertVO certVO = kmcCertCheck.authCertCheckSix(serverNm + "/web/user/insertPhoneSendNumber.do", mjonMsgVO.getUserId(), mjonMsgVO.getCallFrom(), name);
					AuthCertVO certVO = kmcCertCheck.authCertCheckSix(serverNm + "/web/user/selectPhoneNumberCertChkAjax.do", mjonMsgVO.getUserId(), mjonMsgVO.getCallFrom(), "", mjonMsgVO.getMyNameFlag());
					modelAndView.addObject("certVO", certVO);
					
				/*}else if(mjonMsgVO.getPhmAuthType().equals("02") || mjonMsgVO.getPhmAuthType() == "02") { // ARS
					System.out.println("ARS 인증 ***********************************************");
				} else if(mjonMsgVO.getPhmAuthType().equals("03") || mjonMsgVO.getPhmAuthType() == "03") { // ARS
					System.out.println("서류인증 ***********************************************");
				} */
				modelAndView.addObject("result", "success");
			}
		}catch (Exception e) {
			modelAndView.addObject("message", "다시 시도 부탁드립니다.");
			modelAndView.addObject("result", "fail");
		} 
		
		return modelAndView;
	}
	
	/**
	* 휴대폰 인증 본인, 타인 정보 확인 
	*/
	@RequestMapping("/web/user/selectPhoneNumberCertChkAjax.do")
	public String selectPhoneNumberCertChk(
		HttpServletRequest request, ModelMap model  
		, @RequestParam Map<String, Object> commandMap
		, @ModelAttribute("searchVO") KmcVO kmcVO ) throws Exception {
			
		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       = "";
		
		IcertSecuManager seed = new 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) ;
			}
		}
		
		/*
		 * plusInfo(본인인증 추가파라미터)
		 * 구분지 "§"
		 * [0] = mberId
		 * [1] = 개인 혹은 법인 회원 본인인증일 경우 flag
		 * 
		 * */
		String tmp = kmcVO.getPlusInfo();
		String[] tmpResult = tmp.split("§");
		
		//KMC 본인인증 로그
		AuthCertVO certVO = new AuthCertVO();
		
		certVO.setMberId(tmpResult[0]);
		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);
		
		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
		
		String mblDn = userManageService.selectUserMblDnById(loginVO.getId());
		
		String resultDnFlag = "N";
		if(DI.equals(mblDn)) {
			resultDnFlag = "Y";
		}
		
		model.addAttribute("resultDnFlag", resultDnFlag);
		
		/*
		 *  개인회원 - 본인명의 본인인증의 경우 
		 *  	휴대폰 본인인증 시 회원가입자 이름과 동일해야만 승인
		 *  법인회원 - 본인명의 본인인증의 경우 
		 *  	휴대폰 본인인증 시 회원가입자 이름과 동일해야만 승인
		 *  이준호_230314
		 *  http://pms.iten.co.kr:9999/issues/3088
		 */
		//=======================시작=========================
		//개인 본인명의 - Y
		//법인 대표 - Y
		MberManageVO mberManageVO = new MberManageVO();
		mberManageVO.setMberId(loginVO.getId());
		mberManageVO = userManageService.selectUserInfo(mberManageVO);
		String ceoNm = mberManageVO.getCeoNm() == null ? "" : mberManageVO.getCeoNm();
		
		String resultNameChk = "";
		//본인인증 호출부에서 myNameFlag값 == tmpResult[1]
		if("Y".equals(tmpResult[1])) {
			
			if("p".equals(mberManageVO.getDept())) {
				//개인회원일경우
				//이름에 본인인증결과(이름)이 같을 경우
				if(kmcVO.getName().trim().equals(loginVO.getName().trim())) {
					resultNameChk = "Y";
				}
				else {
					resultNameChk = "N";
				}
				
			}
			if("c".equals(mberManageVO.getDept())) {
				//법인회원 일 경우
				if(ceoNm.contains(kmcVO.getName().trim())) {
					resultNameChk = "Y";
				}
				//대표자명에 본인인증결과(이름)이 포함 되지 않을 경우
				else {
					resultNameChk = "N";
				}
			}
		}
		model.addAttribute("resultNameChk", resultNameChk);
		//=======================끝=========================
		
		String birthDay_tmp = "";
		try {
			birthDay_tmp = kmcVO.getMBirthDay().length() != 0 ? kmcVO.getMBirthDay() : kmcVO.getBirthDay();
		} catch (Exception e) {
			birthDay_tmp = birthDay;
		}
		model.addAttribute("CI", kmcVO.getCI());
		model.addAttribute("birthDay", birthDay_tmp);
		
		return "web/user/selectPhoneNumberCertChkReq";
	}
	
	/**
	* 휴대폰 인증 발신번호 등록 
	*/
	@RequestMapping("/web/user/testtest.do")
	public String test222(
		HttpServletRequest request, ModelMap model  
		, @RequestParam Map<String, Object> commandMap
		, @ModelAttribute("searchVO") KmcVO kmcVO ) throws Exception {
	
		model.addAttribute("resultDnFlag", "Y");
		
		return "web/user/selectPhoneNumberCertChkReq";
	}
	
	/**
	* 휴대폰 인증 발신번호 등록 
	*/
	@RequestMapping("/web/user/insertPhoneSendNumber.do")
	public String insertPhoneSendNumber(
		HttpServletRequest request, ModelMap model  
		, @RequestParam Map<String, Object> commandMap
		, @ModelAttribute("searchVO") KmcVO kmcVO ) throws Exception {
			
		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       = "";
		
		IcertSecuManager seed = new 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) ;
			}
		}
		
		MjPhoneMemberVO mjPhoneMemberVO = new MjPhoneMemberVO();
		
		mjPhoneMemberVO.setUserId(plusInfo);
		mjPhoneMemberVO.setPhmType("01");
		mjPhoneMemberVO.setPhmAuthType("01");
		mjPhoneMemberVO.setFrstRegisterId(plusInfo);
		mjPhoneMemberVO.setLastUpdusrId(plusInfo);
		mjPhoneMemberVO.setPhoneNumber(phoneNo);
		mjPhoneMemberVO.setUserName(name);
		mjPhoneMemberVO.setAuthYn("Y");
		mjonMsgService.insertSendNumber(mjPhoneMemberVO);
		
		
		model.addAttribute("kmcVO", kmcVO);
		
		return "web/user/sendNumberKmcReqPage";
	}
	
	/**
	 * ARS 인증 발신번호 등록 
	 */
	@RequestMapping("/web/user/insertArsSendNumberAjax.do")
	public ModelAndView insertArsSendNumberAjax(CertVO certVO
			, HttpServletResponse response
			, HttpServletRequest request) throws Exception {
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		try {
			
			LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
			MjPhoneMemberVO mjPhoneMemberVO = new MjPhoneMemberVO();
			mjPhoneMemberVO.setPhmType("01");
			mjPhoneMemberVO.setUserId(loginVO.getId());
			mjPhoneMemberVO.setPhmAuthType("02");
			mjPhoneMemberVO.setFrstRegisterId(loginVO.getId());
			mjPhoneMemberVO.setLastUpdusrId(loginVO.getId());
			mjPhoneMemberVO.setPhoneNumber(certVO.getSentPhoneNumber()); // 발송 전화번호
			mjPhoneMemberVO.setUserName(loginVO.getName());
			mjPhoneMemberVO.setAuthYn("Y");
			mjonMsgService.insertSendNumber(mjPhoneMemberVO);
			modelAndView.addObject("result", "success");
			
		}catch (Exception e) {
			modelAndView.addObject("message", "다시 시도 부탁드립니다.");
			modelAndView.addObject("result", "fail");
		}
		
		return modelAndView;
	}
	
	/**
	 *  서류인증(통신사 가입 증명서) 등록
	 */
	@SuppressWarnings("unused")
	@RequestMapping("/web/user/insertDocumentSendNumberAjax.do")
	public ModelAndView insertDocumentSendNumberAjax(
		CertVO certVO
		, HttpServletResponse response
		, HttpServletRequest request
		, final MultipartHttpServletRequest multiRequest) throws Exception {
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		
		MjPhoneMemberVO mjPhoneMemberVO = new MjPhoneMemberVO();
		mjPhoneMemberVO.setOwnerName(certVO.getOwnerName()); //본인인증 명의 이름 세팅
		try {
			
			LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
			// 발신번호 서류관리 등록 [시작]
			
			String atchFileId = "";
			String isThumbFile = "";
			final Map<String, MultipartFile> files = multiRequest.getFileMap();
			if (!files.isEmpty()){
				List<FileVO> result = fileUtil.parseFileInf(files, "CERT_", 0, atchFileId , "", isThumbFile);
				atchFileId = fileMngService.insertFileInfs(result);
				certVO.setAtchFileId(atchFileId);

				//인증서류 데이터 입력하기
				certVO.setCertId(egovCertEtcIdGnrService.getNextStringId());
				certVO.setUserId(loginVO.getId());
				certVO.setFrstRegisterId(loginVO.getId());
				certService.insertCertFile(certVO);
			}
			// 발신번호 서류관리 등록 [끝]
			
			// 발신번호 등록 [시작]
			mjPhoneMemberVO.setPhmType("01");
			mjPhoneMemberVO.setUserId(loginVO.getId());
			mjPhoneMemberVO.setCertId(certVO.getCertId());
			mjPhoneMemberVO.setPhmAuthType(certVO.getCertType());	//번호 인증 타입 01:휴대폰인증, 03: 서류인증
			mjPhoneMemberVO.setFrstRegisterId(loginVO.getId());
			mjPhoneMemberVO.setLastUpdusrId(loginVO.getId());
			mjPhoneMemberVO.setPhoneNumber(certVO.getSentPhoneNumber()); // 발송 전화번호  
			if(!"".equals(certVO.getSendPhoneNumber()) && certVO.getSendPhoneNumber() != null) { //230530 추가 - 고객이 인증 후 입력 한 발신번호를 수정하면, 수정 한 발신번호가 등록되어서 인증했을 경우 인증한 번호로 발신번호 등록하게끔 추가
				mjPhoneMemberVO.setPhoneNumber(certVO.getSendPhoneNumber()); 
			}
			mjPhoneMemberVO.setUserName(loginVO.getName());
			mjPhoneMemberVO.setSendPhoneNumber(certVO.getSendPhoneNumber()); // 확인  전화번호
			mjPhoneMemberVO.setPhmValue(certVO.getPhmValue()); //비고
			mjPhoneMemberVO.setNameType(certVO.getNameType());
			mjPhoneMemberVO.setDept(certVO.getDept());
			
			mjPhoneMemberVO.setCI(certVO.getCI()); // CI값
			mjPhoneMemberVO.setBirthDay(certVO.getBirthDay()); // 생년월일

			//개인회원 본인 인증인 경우 핸드폰 번호 즉시 승인해주기
			String dept = certVO.getDept();
			String nameType = certVO.getNameType();
			String certType = certVO.getCertType();
			
			if(StringUtil.isNotEmpty(dept) && StringUtil.isNotEmpty(nameType)) {
				//회원종류 개인, 인증 종류 휴대폰 본인 인증인경우 즉시 승인
				if(dept.equals("p") && nameType.equals("5") && certType.equals("01")) {
					mjPhoneMemberVO.setAuthYn("Y");
					
				}else if(dept.equals("c") && nameType.equals("2") && certType.equals("01")){
					//기업회원 중 대표 이면서 휴대폰 인증인 경우 즉시 승인
					mjPhoneMemberVO.setAuthYn("Y");
					
				}else {
					mjPhoneMemberVO.setAuthYn("H");
				}
				
			}else {
				mjPhoneMemberVO.setAuthYn("H");
			}
			mjonMsgService.insertSendNumber(mjPhoneMemberVO);
			// 발신번호 등록 [끝]
			
			// 즉시승인이 아닌경우 관리자에게 이메일 발송
			/*if (!mjPhoneMemberVO.getAuthYn().equals("Y")) {
				String title = "번호관리 > 발신번호 승인 요청";
				// CS관리자 이메일 알림전송
				mjonNoticeSendUtil.csAdminEmailNoticeSend(loginVO.getName(), loginVO.getId(), title);
			}*/
			
			modelAndView.addObject("result", "success");
		}catch (Exception e) {
			modelAndView.addObject("message", "다시 시도 부탁드립니다.");
			modelAndView.addObject("result", "fail");
			
			return modelAndView;
		} 
		
		/**
		 * 발신번호 등록시 승인 심사가 필요한 경우
		 * 관리자에게 승인 신청 접수 내역을 알리는 
		 * 메일 발송 및 문자 발송을 진행한다.
		 * 2022.09.26 우영두 수정
		 * 
		 * 에러가 발생시 오류 메세지만 로그 기록하고 완료 처리함
		 * */
		
		try {
			
			// 즉시승인이 아닌경우 문자온 법인폰으로 알림 문자 발송하기.
			if (!mjPhoneMemberVO.getAuthYn().equals("Y")) {
				String title = "번호관리 > 발신번호 승인 요청";
				String userNm = mjPhoneMemberVO.getUserName();
				String userId = mjPhoneMemberVO.getUserId();
				String phoneNum = mjPhoneMemberVO.getPhoneNumber();
				
				// 법인폰 알람여부 체크
				JoinSettingVO joinSettingVO = new JoinSettingVO();
				joinSettingVO = egovSiteManagerService.selectAdminNotiDetail();
				
				// 이메일 체크
				if (joinSettingVO != null && joinSettingVO.getEmailNoti().equals("Y")) {
					// CS관리자 이메일 알림전송
					mjonNoticeSendUtil.csAdminEmailNoticeSend(userNm, userId, title);
				}

				// SMS 체크				
				if (joinSettingVO != null && joinSettingVO.getSmsNoti().equals("Y")) {
					MjonCommon mjCommon = new MjonCommon();
					MjonMsgVO mjonMsgVO = new MjonMsgVO();
					
					//발신번호 등록(관리자에게 알림이기에 발신번호도 법인폰 번호로 한다. 01084329333 )
					mjonMsgVO.setCallFrom("01084329333");
					//발송 문자 내용 등록
					String smsTxt = "[발신번호 승인 요청] "+ userNm +"(" + userId + ")/발신번호 " + phoneNum + "/승인 요청";
					mjonMsgVO.setSmsTxt(smsTxt);
					
					//발송 문자 타입(단/장문) 등록
					//문자열 길이 체크 해주기
		        	String charset = "euc-kr"; 						//문자 바이트 계산에 필요한 캐릭터 셋 : 한글 2Byte로 계산
		        	
		        	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 resultCom = mjCommon.getAdminPhoneSendMsgDataComm(mjonMsgVO);
					
					//문자온 법인폰으로 문자 발송 처리
					mjonMsgDataService.insertAdmToMberMsgDataInfo(mjonMsgVO);					
				}				
				
				// SLACK 체크
				if (joinSettingVO != null && joinSettingVO.getSlackNoti().equals("Y")) {				
					// Slack 메시지 발송(단순본문)
					String msg = "[문자온] 발신번호 승인 요청 - " + userNm +"("+ userId + ")";
					mjonCommon.sendSimpleSlackMsg(msg);				
				}
			}
			
		} catch (Exception e) {
			System.out.println("+++++++++++++++++++++++++++++ 발신번호 등록 승인 요청   문자온 법인폰으로 문자 발송 및 이메일 알림 발송  Function Error !!!" + e);
		}
		
		return modelAndView;
	}
	
	/**
	 *  발신번호 삭제
	 */
	@RequestMapping(value = "/web/user/deleteSendNumberAjax.do")
	public ModelAndView deleteSendNumberAjax(@ModelAttribute("mjPhoneMemberVO") MjPhoneMemberVO mjPhoneMemberVO) throws Exception {
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
		mjPhoneMemberVO.setUserId(loginVO.getId());
		//삭제 전 기본번호 조회
		String baseYId = mjonMsgService.selectBaseYPhoneNum(mjPhoneMemberVO);
		try {
			mjonMsgService.deleteSendNumberDelete(mjPhoneMemberVO);
			
			//삭제 번호가 기본번호 일 시 다른번호 기본번호 설정하기
			if(baseYId != null && baseYId.equals(mjPhoneMemberVO.getPhmId())) {
				mjonMsgService.updateBaseYPhoneNumLately(mjPhoneMemberVO);
			}
			
			modelAndView.addObject("result", "success");
		}catch (Exception e) {
			modelAndView.addObject("message", "다시 시도 부탁드립니다.");
			modelAndView.addObject("result", "fail");
		} 
		return modelAndView;
	}
	
	/**
	 *  발신번호 일괄 삭제
	 */
	@RequestMapping(value = "/web/user/deleteSendNumberAllAjax.do")
	public ModelAndView deleteSendNumberAllAjax(@RequestParam("chk") String[] chk, @ModelAttribute("mjPhoneMemberVO") MjPhoneMemberVO mjPhoneMemberVO) throws Exception {
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		
		LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
		mjPhoneMemberVO.setUserId(loginVO.getId());
		//삭제 전 기본번호 조회
		String baseYId = mjonMsgService.selectBaseYPhoneNum(mjPhoneMemberVO);
		
		try {
			for(String id: chk) {
				mjPhoneMemberVO.setPhmId(id);
				mjonMsgService.deleteSendNumberDelete(mjPhoneMemberVO);	
				
				//삭제 번호가 기본번호 일 시 다른번호 기본번호 설정하기
				if(baseYId != null && baseYId.equals(mjPhoneMemberVO.getPhmId())) {
					mjonMsgService.updateBaseYPhoneNumLately(mjPhoneMemberVO);
				}
			}
			modelAndView.addObject("result", "success");
		}catch (Exception e) {
			modelAndView.addObject("message", "다시 시도 부탁드립니다.");
			modelAndView.addObject("result", "fail");
		} 
		return modelAndView;
	}
	
	/**
	 *  발신번호 기본번호 설정
	 */
	@RequestMapping(value = "/web/user/updateSendNumberBaseYnAjax.do")
	public ModelAndView updateSendNumberBaseYnAjax(@RequestParam("baseId") String baseId, @ModelAttribute("mjPhoneMemberVO") MjPhoneMemberVO mjPhoneMemberVO) throws Exception {
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
		try {
				mjPhoneMemberVO.setUserId(loginVO.getId());
				mjPhoneMemberVO.setPhmId(baseId);
				//업데이트문 개발 시작
				mjonMsgService.updateSendNumberBaseYn(mjPhoneMemberVO);	
			modelAndView.addObject("result", "success");
		}catch (Exception e) {
			modelAndView.addObject("message", "다시 시도 부탁드립니다.");
			modelAndView.addObject("result", "fail");
		} 
		return modelAndView;
	}
	
	/**
	* 알림설정
	*/
	@RequestMapping(value="/web/user/notifyManage.do")
	public String notifyManage(
		@ModelAttribute MberManageVO mberManageVO
		, HttpServletRequest request
		, ModelMap model) throws Exception {
		
		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
		if(loginVO == null) {
			return "redirect:/web/user/login/login.do";
		}
		model.addAttribute("loginVO", loginVO);
		mberManageVO.setMberId(loginVO.getId());
		MberManageVO userInfo = userManageService.selectUserInfo(mberManageVO);
		model.addAttribute("userInfo", userInfo);
		model.addAttribute("pageTab", "notifyManage");
		
		return "web/user/notifyManage";
	}
	
	/**
	* 발송결과 알림 수정
	*/
	@RequestMapping(value = "/web/user/updateSandResultAjax.do")
	public ModelAndView updateSandResultAjax(@ModelAttribute("mberManageVO") MberManageVO mberManageVO) throws Exception {
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		try {
			if(mberManageVO.getUserTy().equals("tab1")) {
				userManageService.updateSandResul(mberManageVO);
			}else if(mberManageVO.getUserTy().equals("tab2")) {
				userManageService.updateNoticet(mberManageVO);
			}
			modelAndView.addObject("result", "success");
		}catch (Exception e) {
			modelAndView.addObject("message", "다시 시도 부탁드립니다.");
			modelAndView.addObject("result", "fail");
		} 
		return modelAndView;
	}
	
	
	/**
	* 회원탈퇴 본인인증 화면
	*/
	@RequestMapping(value="/web/user/mberSecession.do")
	public String mberSecession(@ModelAttribute MberManageVO mberManageVO
		, ModelMap model, HttpServletRequest request, RedirectAttributes redirectAttributes) throws Exception {
		
		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
		if(loginVO == null) {
			//redirectAttributes.addFlashAttribute("message", "문자온 서비스는 로그인 후 이용 가능합니다.");
			return "redirect:/web/user/login/login.do";
		}
		model.addAttribute("loginVO", loginVO);
		model.addAttribute("pageTab", "mberSecession");
		
		mberManageVO.setMberId(loginVO.getId());
		MberManageVO userInfo = userManageService.selectUserInfo(mberManageVO);
		model.addAttribute("userInfo", userInfo);
		
		String name = userInfo.getMberNm(); // 이름
		
		if(loginVO.getDept().equals("c")) {
			name = userInfo.getManagerNm();
		}
		
		KmcCertChecker kmcCertCheck = new KmcCertChecker();
		
		//kmc 본인인증 실/개발 서버 구분
		String serverNm = "";
		if(request.getServerName().contains("219.240.88.15") || request.getServerName().contains("localhost")) {
			serverNm = request.getScheme() + "://219.240.88.15:8095";
		}else{
			serverNm = request.getScheme() + "://www.munjaon.co.kr";
		}
		
		AuthCertVO certVO = kmcCertCheck.authCertCheckSeven(serverNm + "/web/user/selectMberSecessionAjax.do", name);
		model.addAttribute("certVO", certVO);
		
		return "web/user/mberSecession";
	}
	
	/**
	* 회원탈퇴 상세정보 화면
	*/
	@RequestMapping(value="/web/user/mberSecessionInfo.do")
	public String mberSecessionInfo(@ModelAttribute MberManageVO mberManageVO
		, RedirectAttributes redirectAttributes
		, ModelMap model) throws Exception {
		LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
		model.addAttribute("loginVO", loginVO);
		model.addAttribute("pageTab", "mberSecession");
		
		//본인인증 했는지 확인 필요
		if(mberManageVO.getKeyCheck() == null || !mberManageVO.getKeyCheck().equals("Y")) {
			redirectAttributes.addFlashAttribute("message", "본인인증 진행 하세요.");
			RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/web/user/mberSecession.do");
			return redirectUrlMaker.getRedirectUrl();
		}
		
		mberManageVO.setMberId(loginVO.getId());
		MberManageVO userInfo = userManageService.selectUserInfo(mberManageVO);
		model.addAttribute("userInfo", userInfo);
		
		return "web/user/mberSecessionInfo";
	} 
	
	/**
	* 회원탈퇴 
	*/
	@RequestMapping(value="/web/user/mberDeleteInfoAjax.do")
	public ModelAndView mberDeleteInfoAjax(MberManageVO mberManageVO
		, HttpServletRequest request
		, HttpServletResponse response) throws Exception {
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		try {
			LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
			mberManageVO.setMberId(loginVO.getId());
			userManageService.updateDeleteInfo(mberManageVO);
			modelAndView.addObject("result", "success");
		}catch (Exception e) {
			modelAndView.addObject("message", "다시 시도 부탁드립니다.");
			modelAndView.addObject("result", "fail");
		}
		return modelAndView;
	}
	
	/**
	* 회원탈퇴 본인인증 
	*/
	@RequestMapping("/web/user/selectMberSecessionAjax.do")
	public String selectMberSecessionAjax(
		HttpServletRequest request, ModelMap model  
		, @RequestParam Map<String, Object> commandMap
		, @ModelAttribute("searchVO") KmcVO kmcVO ) throws Exception {
			
		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) ;
			}
		}
		
		MjPhoneMemberVO mjPhoneMemberVO = new MjPhoneMemberVO();
		
		mjPhoneMemberVO.setUserId(plusInfo);
		mjPhoneMemberVO.setPhmType("01");
		mjPhoneMemberVO.setPhmAuthType("01");
		mjPhoneMemberVO.setFrstRegisterId(plusInfo);
		mjPhoneMemberVO.setLastUpdusrId(plusInfo);
		mjPhoneMemberVO.setPhoneNumber(phoneNo);
		mjPhoneMemberVO.setUserName(name);
		mjPhoneMemberVO.setAuthYn("Y");
		mjonMsgService.insertSendNumber(mjPhoneMemberVO);
		
		
		model.addAttribute("kmcVO", kmcVO);
		
		return "web/user/mberSecessionKmcReqPage";
	}
	
	// 파라미터 유효성 검증 --------------------------------------------
	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";
	}
	
	public Boolean findIdKmcCheck(String DI, String Name, String PhoneNo) throws Exception {
		UserManageVO userManageVO = new UserManageVO();
		
		userManageVO.setEmplyrNm(Name);
		userManageVO.setMoblphonNo(PhoneNo);
		userManageVO.setMblDn(DI);
		
		List<UserManageVO> usedNmList = userManageService.selectUserIdAjax(userManageVO);
		
		boolean TorF = usedNmList.size() > 0 ? true : false;
		
		return TorF;
	}
	
	/**
	* KISA 신고 목록
	*/
	@RequestMapping(value="/web/user/kisaReport.do")
	public String kisaReport(
		@ModelAttribute KisaVO kisaVO
		, HttpServletRequest request
		, ModelMap model) throws Exception {
		
		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
		if(loginVO == null) {
			return "redirect:/web/user/login/login.do";
		}
		model.addAttribute("loginVO", loginVO);
		kisaVO.setMberId(loginVO.getId());
		
		MberManageVO mberManageVO = new MberManageVO();
		mberManageVO.setMberId(loginVO.getId());
		MberManageVO userInfo = userManageService.selectUserInfo(mberManageVO);
		model.addAttribute("userInfo", userInfo);
		model.addAttribute("pageTab", "kisaReport");
		
		// List Start
		if(kisaVO.getPageUnit() != 10) {
			kisaVO.setPageUnit(kisaVO.getPageUnit());
		}

		/** pageing */
		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(kisaVO.getPageIndex());
		paginationInfo.setRecordCountPerPage(kisaVO.getPageUnit());
		paginationInfo.setPageSize(kisaVO.getPageSize());
		
		kisaVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
		kisaVO.setLastIndex(paginationInfo.getLastRecordIndex());
		kisaVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
		
		if("".equals(kisaVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
			kisaVO.setSearchSortCnd("kisaId");
			kisaVO.setSearchSortOrd("desc");
		}
		
        List<KisaVO> kisaList = kisaService.selectKisaList(kisaVO);
        int totCnt = 0;
        if(kisaList.size() > 0) {
			totCnt = kisaList.get(0).getTotcnt();
		}
        model.addAttribute("kisaList", kisaList);
        
        paginationInfo.setTotalRecordCount(totCnt);
		model.addAttribute("paginationInfo", paginationInfo);		
		
		return "web/user/kisaReport";
	}
	
	/**
	* KISA 신고 상세
	*/
	@RequestMapping(value="/web/user/kisaReportDetailAjax.do")
	public ModelAndView kisaReportDetailAjax(@ModelAttribute KisaVO kisaVO,
			ModelMap model) throws Exception{
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		
		boolean isSuccess = true;
		String msg = "";
		List<FileVO> fileList = null;
		
		try {
			kisaVO = kisaService.selectKisaDetail(kisaVO);
			
			if(kisaVO.getAtchFileId() !=null) {
				FileVO fileVO = new FileVO();
				fileVO.setAtchFileId(kisaVO.getAtchFileId());
				fileList = fileService.selectFileInfs(fileVO);
			}			
    	}
		catch(Exception e) {
			isSuccess = false;
    		msg = e.getMessage();
    	}
			
		modelAndView.addObject("isSuccess", isSuccess);        		
		modelAndView.addObject("msg", msg);
		modelAndView.addObject("result", kisaVO);
		model.addAttribute("fileList", fileList);
		
		return modelAndView;
	}  	
	
	/**
	* KISA 서명자료(첨부파일) 목록
	*/
	@RequestMapping(value="/web/user/kisaSignFileListAjax.do")
	public ModelAndView kisaSignFileListAjax(@ModelAttribute KisaVO kisaVO,
			ModelMap model) throws Exception{
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		
		boolean isSuccess = true;
		String msg = "";
		List<FileVO> fileList = null;
		
		try {
			kisaVO = kisaService.selectKisaDetail(kisaVO);
			
			if(kisaVO.getAtchFileId2() !=null) {
				FileVO fileVO = new FileVO();
				fileVO.setAtchFileId(kisaVO.getAtchFileId2());
				fileList = fileService.selectFileInfs(fileVO);
			}			
    	}
		catch(Exception e) {
			isSuccess = false;
    		msg = e.getMessage();
    	}
			
		modelAndView.addObject("isSuccess", isSuccess);        		
		modelAndView.addObject("msg", msg);
		model.addAttribute("fileList", fileList);
		
		return modelAndView;
	}  	
		
	
	
	/**
	* KISA 서명 파일업로드
	*/
	@RequestMapping(value="/web/user/kisaSignFileSaveAjax.do")
	public ModelAndView kisaSignFileSaveAjax(final MultipartHttpServletRequest multiRequest
			, KisaVO kisaVO
			, RedirectAttributes redirectAttributes
			, HttpServletRequest request) throws Exception {
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		
		kisaVO = kisaService.selectKisaDetail(kisaVO);
		String atchFileId2 = kisaVO.getAtchFileId2();
		final Map<String, MultipartFile> files = multiRequest.getFileMap();
		
		if (!files.isEmpty()) {
			if ("".equals(atchFileId2)) {
				List<FileVO> result = fileUtil.parseFileInf(files, "KISA_SIGN_", 0, atchFileId2, "", "");
				
				atchFileId2 = fileMngService.insertFileInfs(result);
				kisaVO.setAtchFileId2(atchFileId2);
			} else {
				FileVO fvo = new FileVO();
				fvo.setAtchFileId(atchFileId2);
				int cnt = fileMngService.getMaxFileSN(fvo);
				List<FileVO> result = fileUtil.parseFileInf(files, "KISA_", cnt, atchFileId2, "", "");
				
				fileMngService.updateFileInfs(result);
			}
		}
		
		kisaVO.setKisaReceptState("4");		// KISA 소명자료 제출 완료
		kisaVO.setKisaPopupYn("N");			// 매인페이지 Popup Close
		kisaService.updateKisa(kisaVO);
		
		modelAndView.addObject("result", "success");
		return modelAndView;
	}	
	
	/**
	* KISA 서명하기
	*/
	@RequestMapping(value="/web/user/kisaSignSaveAjax.do")
	public ModelAndView kisaSignSaveAjax(final MultipartHttpServletRequest multiRequest
			, KisaVO kisaVO
			, RedirectAttributes redirectAttributes
			, HttpServletRequest request) throws Exception {
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");

		boolean isSuccess = true;
		String msg = "";
		
		// 날짜
		SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date now = new Date();
		
		// 서명정보
		String kisaSignNm = "";
		String kisaSignPhoneNo = "";
		String kisaSignPnttm = "";
		
		try {		
			LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
			if(loginVO != null) {
				// 서명정보
				kisaSignNm = loginVO.getName();
				kisaSignPhoneNo = loginVO.getMoblphonNo();
				kisaSignPnttm = sdf1.format(now);

				for(String kisaId : kisaVO.getKisaIds()) { 
					kisaVO.setKisaId(kisaId);
					kisaVO = kisaService.selectKisaDetail(kisaVO);
		
					// 업데이트
					kisaVO.setKisaSignNm(kisaSignNm);
					kisaVO.setKisaSignPhoneNo(kisaSignPhoneNo);
					kisaVO.setKisaSignPnttm(kisaSignPnttm);
					
					if (kisaVO.getKisaReportState().equals("1")) {
						// KISA 서명 요청
						kisaVO.setKisaReceptState("2");		// KISA 서명 서명 완료
						kisaVO.setKisaPopupYn("N");			// 매인페이지 Popup Close
					}
					else if (kisaVO.getKisaReportState().equals("3")) {
						// 당사경고 서명 요청
						kisaVO.setKisaReceptState("2");		// KISA 서명 서명 완료	
						kisaVO.setKisaPopupYn("N");			// 매인페이지 Popup Close
					}					
					else {
						// KISA 소명자료 요청
						kisaVO.setKisaReceptState("3");		// KISA 소명자료 미제출
					}
										
					kisaService.updateKisa(kisaVO);
				}
			}
			else {
				isSuccess = false;
	    		msg = "로그인후 이용해주세요.";
			}
    	}
		catch(Exception e) {
			isSuccess = false;
    		msg = e.getMessage();
    	}		

		modelAndView.addObject("isSuccess", isSuccess);        		
		modelAndView.addObject("msg", msg);
		return modelAndView;
	}			
	
	
	@RequestMapping(value = "/web/user/selectRejectAjax.do")
	public ModelAndView selectRejectAjax(@ModelAttribute("mjPhoneMemberVO") MjPhoneMemberVO mjPhoneMemberVO) throws Exception {
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
		
		try {
			MjPhoneMemberVO rejectInfo = mjonMsgService.selectSendPhoneNumberByPhmId(mjPhoneMemberVO.getPhmId());
			modelAndView.addObject("rejectInfo", rejectInfo);
			modelAndView.addObject("result", "success");
		}catch (Exception e) {
			modelAndView.addObject("message", "다시 시도 부탁드립니다.");
			modelAndView.addObject("result", "fail");
		} 
		return modelAndView;
	}
}
