이호영 이호영 2025-03-10
카톡발송 화면 json 로직 수정 및 발송 VO 생성
@301135e19070ab680c731e0c351fc60c825cdb7e
 
src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java (added)
+++ src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java
@@ -0,0 +1,68 @@
+package itn.let.kakao.kakaoComm;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+* @FileName : KakaoSendVO.java
+* @Project : mjon
+* @Date : 2025. 3. 25.
+* @작성자 :  이호영
+
+* @프로그램 설명 : 문자온 발송부분만 ADVC
+*/
+@Getter
+@Setter
+public class KakaoSendAdvcVO implements Serializable {
+
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 343099046833205405L;
+	
+	private String msgId;				// 문자ID
+	private String msgGroupId;			// 전송그룹ID
+	private String userId;				// 사용자ID
+	private String agentCode;			// 전송사코드
+	private String senderKey;			// 발신프로필 키
+	private String templateCode;		// 템플릿 코드
+	private String callTo;				// 수신번호
+	private String callFrom;			// 발신번호
+	private String msgType;				// 메시지 타입
+	private String templateContent;		// 템플릿 내용
+	private String templateTitle;		// 템플릿 제목
+	private String subMsgSendYn;		// 대체문자 전송 여부
+	private String subMsgTxt;			// 대체문자 내용
+	private String subMsgType;			// 대체문자 타입
+	private String bizJsonName;			// JSON 파일명
+	private String reqDate;				// 예약일시
+	
+	@Override
+	public String toString() {
+		return "MsgSendVO[" +
+			"\n msgId=[" + msgId + "]" +
+			"\n , msgGroupId=[" + msgGroupId + "]" +
+			"\n , userId=[" + userId + "]" +
+			"\n , agentCode=[" + agentCode + "]" +
+			"\n , senderKey=[" + senderKey + "]" +
+			"\n , templateCode=[" + templateCode + "]" +
+			"\n , callTo=[" + callTo + "]" +
+			"\n , callFrom=[" + callFrom + "]" +
+			"\n , msgType=[" + msgType + "]" +
+			"\n , templateContent=[" + templateContent + "]" +
+			"\n , templateTitle=[" + templateTitle + "]" +
+			"\n , subMsgSendYn=[" + subMsgSendYn + "]" +
+			"\n , subMsgTxt=[" + subMsgTxt + "]" +
+			"\n , subMsgType=[" + subMsgType + "]" +
+			"\n , bizJsonName=[" + bizJsonName + "]" +
+			"\n , reqDate=[" + reqDate + "]" +
+			"\n ]";
+	}
+
+	
+}
src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java
--- src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java
+++ src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java
@@ -1,7 +1,10 @@
 package itn.let.kakao.kakaoComm;
 
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import javax.annotation.Resource;
 
@@ -10,9 +13,11 @@
 
 import itn.com.cmm.util.StringUtil;
 import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiJsonSave;
+import itn.let.mail.service.StatusResponse;
 import itn.let.mjo.msg.service.MjonMsgVO;
 import itn.let.mjo.msgdata.service.MjonMsgDataService;
 import itn.let.mjo.spammsg.web.ComGetSpamStringParser;
+import itn.let.module.base.PriceAndPoint;
 import itn.let.sym.site.service.JoinSettingVO;
 import itn.let.uss.umt.service.MberManageVO;
 
@@ -24,7 +29,141 @@
 	
 	@Resource(name = "MjonMsgDataService")
 	private MjonMsgDataService mjonMsgDataService;
+
+	@Autowired
+	private PriceAndPoint priceAndPoint;
 	
+	/**
+	 * @methodName	: kakaoSendPrice_advc 
+	 * @author		: 이호영
+	 * @date		: 2025. 3. 7.
+	 * @description	: 기존 kakaoSendPrice 개선
+	 * @return : KakaoVO
+	 * @param kakaoVO
+	 * @param statusResponse
+	 * @return
+	 * @throws Exception
+	 * 
+	 */
+	public KakaoVO populateSendLists(KakaoVO kakaoVO, StatusResponse statusResponse) throws Exception {
+		
+		//사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액)
+//		String befCash = kakaoVO.getBefCash();
+		
+		MjonMsgVO mjonMsgVO = new MjonMsgVO();
+		mjonMsgVO.setUserId(kakaoVO.getUserId());
+		String userMoney = priceAndPoint.getBefCash(kakaoVO.getUserId());
+		String userPoint = priceAndPoint.getBefPoint(kakaoVO.getUserId());
+		
+		//1.시스템 기본 단가 정보 불러오기
+		JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo();
+		
+		//2.사용자 개인 단가 정보 불러오기
+		MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(kakaoVO.getUserId());
+		Float kakaoAtPrice = mberManageVO.getKakaoAtPrice();
+		
+		/** 대체문자 여부 체크(있으면 대체문자 가격으로 없으면 카카오톡 가격으로) */
+		//대체문자 발송 여부 확인
+		if("Y".equals(kakaoVO.getSubMsgSendYn())) {
+			
+//			MsgSendUtils.getSmsTxtBytes
+			
+			
+			String charset = "euc-kr"; 											//문자 바이트 계산에 필요한 캐릭터 셋 : 한글 2Byte로 계산
+			int callToCnt = kakaoVO.getCallToList().length;
+			String sendType = "";
+			
+			for(int count =0; count < callToCnt; count++) {
+				
+				
+				String tempSubMagTxt = kakaoVO.getSubMsgTxt().replace("\r\n", "\n");
+				
+				
+				if(kakaoVO.getSubMsgTxtReplYn().equals("Y")) {
+					tempSubMagTxt = kakaoSubMagTxtRepl(tempSubMagTxt, kakaoVO, count);
+				}
+				int bytes = tempSubMagTxt.getBytes(charset).length;
+				
+				if(bytes < 2000) {
+					if(bytes > 90) {
+						sendType = "MMS";
+						break;
+					}else {
+						sendType = "SMS";
+					}
+				}else {
+					kakaoVO.setResultCode("2000");
+					return kakaoVO;
+				}
+			}
+			
+			if(sendType.equals("MMS")) {
+				//협의 단가가 없으면 시스템 단가로 지정
+				if(mberManageVO.getLongPrice() < 1) {
+					kakaoAtPrice = sysJoinSetVO.getLongPrice();
+					
+					kakaoVO.setSmsPrice(sysJoinSetVO.getShortPrice());
+					kakaoVO.setMmsPrice(sysJoinSetVO.getLongPrice());
+					kakaoVO.setKakaoAtPrice(sysJoinSetVO.getKakaoAtPrice());
+				}else {
+					kakaoAtPrice = mberManageVO.getLongPrice();
+					
+					kakaoVO.setSmsPrice(mberManageVO.getShortPrice());
+					kakaoVO.setMmsPrice(mberManageVO.getLongPrice());
+					
+					if(mberManageVO.getKakaoAtPrice() < 1) {
+						kakaoVO.setKakaoAtPrice(sysJoinSetVO.getKakaoAtPrice());
+					}else {
+						kakaoVO.setKakaoAtPrice(mberManageVO.getKakaoAtPrice());
+					}
+				}
+			}else {
+				//협의 단가가 없으면 시스템 단가로 지정
+				if(mberManageVO.getShortPrice() < 1) {
+					kakaoAtPrice = sysJoinSetVO.getShortPrice();
+					
+					kakaoVO.setSmsPrice(sysJoinSetVO.getShortPrice());
+					kakaoVO.setMmsPrice(sysJoinSetVO.getLongPrice());
+					kakaoVO.setKakaoAtPrice(sysJoinSetVO.getKakaoAtPrice());
+				}else {
+					kakaoAtPrice = mberManageVO.getShortPrice();
+					
+					kakaoVO.setSmsPrice(mberManageVO.getShortPrice());
+					kakaoVO.setMmsPrice(mberManageVO.getLongPrice());
+					if(mberManageVO.getKakaoAtPrice() < 1) {
+						kakaoVO.setKakaoAtPrice(sysJoinSetVO.getKakaoAtPrice());
+					}else {
+						kakaoVO.setKakaoAtPrice(mberManageVO.getKakaoAtPrice());
+					}
+				}
+			}
+		}else {
+			if(kakaoAtPrice < 1) { //협의 단가가 없으면 시스템 단가로 지정
+				kakaoAtPrice = sysJoinSetVO.getKakaoAtPrice();
+				
+				kakaoVO.setSmsPrice(sysJoinSetVO.getShortPrice());
+				kakaoVO.setMmsPrice(sysJoinSetVO.getLongPrice());
+				kakaoVO.setKakaoAtPrice(sysJoinSetVO.getKakaoAtPrice());
+			}else {
+				kakaoVO.setSmsPrice(mberManageVO.getShortPrice());
+				kakaoVO.setMmsPrice(mberManageVO.getLongPrice());
+				kakaoVO.setKakaoAtPrice(mberManageVO.getKakaoAtPrice());
+			}
+		}
+		
+		/** 전송인원 확인*/
+		int totCallCnt = kakaoVO.getCallToList().length;
+		Float kakaoTotPrice = totCallCnt * kakaoAtPrice; // 총결제 금액  = 총 전송수량 * 카카오 알림톡 단가
+		String totPrice = kakaoTotPrice.toString();
+		System.out.println("@@@@@@@   : "+kakaoTotPrice  +" =  "+totCallCnt+"  *  "+kakaoAtPrice);
+		
+		kakaoVO.setEachPrice(kakaoAtPrice.toString());
+		kakaoVO.setBefCash(userMoney); // 고객 충전금액
+		kakaoVO.setBefPoint(userPoint); // 고객 충전 포인트
+		kakaoVO.setTotPrice(totPrice); // 총 카카오 전송 금액
+		
+		return kakaoVO;
+	}
 	
 	/**
 	* @Method Name : kakaoSendPrice
@@ -34,13 +173,11 @@
 	*/
 	public KakaoVO kakaoSendPrice(KakaoVO kakaoVO) throws Exception {
 		
-		//사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액)
-		String befCash = kakaoVO.getBefCash();
+		System.out.println(" :: kakaoSendPrice :: ");
 		
-		//VO에서 현재 보유금액이 없으면 디비에서 조회해서 불러옴
-		if("".equals(befCash) || befCash == null) {
-			
-		}
+		//사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액)
+//		String befCash = kakaoVO.getBefCash();
+		
 		MjonMsgVO mjonMsgVO = new MjonMsgVO();
 		mjonMsgVO.setUserId(kakaoVO.getUserId());
 		String userMoney = mjonMsgDataService.selectBeforeCashData(mjonMsgVO);
@@ -55,6 +192,7 @@
 		
 		/** 대체문자 여부 체크(있으면 대체문자 가격으로 없으면 카카오톡 가격으로) */
 		//대체문자 발송 여부 확인
+		System.out.println(" :: kakaoVO.getSubMsgSendYn() :: "+ kakaoVO.getSubMsgSendYn());
 		if(kakaoVO.getSubMsgSendYn().equals("Y")) {
 			
 			
@@ -66,6 +204,8 @@
 				String tempSubMagTxt = kakaoVO.getSubMsgTxt().replace("\r\n", "\n");
 				if(kakaoVO.getSubMsgTxtReplYn().equals("Y")) {
 					tempSubMagTxt = kakaoSubMagTxtRepl(tempSubMagTxt, kakaoVO, count);
+//					tempSubMagTxt = kakaoSubMagTxtRepl_advc(tempSubMagTxt, kakaoVO, count);
+					System.out.println("+ tempSubMagTxt :: "+ tempSubMagTxt);
 				}
 				int bytes = tempSubMagTxt.getBytes(charset).length;
 				
@@ -401,6 +541,7 @@
 						varValInfo = kakaoVO.getVarValList().get(count);
 					}
 					String jsonFileName = kakaoApiJsonSave.kakaoApiJsonSave(kakaoVO, varValInfo);
+//					String jsonFileName = kakaoApiJsonSave.kakaoApiJsonSave_advc(kakaoVO, varValInfo);
 //					String jsonFileName = kakaoApiJsonSave.kakaoApiJsonSave(kakaoVO, kakaoVO.getVarValList().get(count));
 					setSendMsgVO.setBizJsonName(jsonFileName); //json 파일명
 				}
@@ -509,6 +650,7 @@
 	
 	
 	public String kakaoSubMagTxtRepl(String tempSubMagTxt, KakaoVO kakaoVO, int count) {
+		System.out.println("tempSubMagTxt : "+ tempSubMagTxt);
 		
 //		String tempSubMagTxt = kakaoVO.getSubMsgTxt().replace("\r\n", "\n");
 //		String tempSubMagTxt = msgTxt;
@@ -551,6 +693,7 @@
 		return tempSubMagTxt;
 	}
 	
+	
 	public String kakaoFTSubMagTxtRepl(String tempSubMagTxt, KakaoVO kakaoVO, int count) throws Exception{
 
 		List<String[]> varValList = kakaoVO.getVarValList();
src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java
--- src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java
+++ src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java
@@ -2,8 +2,11 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 import itn.let.mjo.msg.service.MjonMsgVO;
+import lombok.Getter;
+import lombok.Setter;
 
 /**
 * @FileName : KakaoVO.java
@@ -13,6 +16,8 @@
 
 * @프로그램 설명 : 카카오톡 요청 변수 목록 (문자온VO를 상속 받음)
 */
+@Getter
+@Setter
 public class KakaoVO extends MjonMsgVO{
 
 	private static final long serialVersionUID = 536382850588307019L;
@@ -247,995 +252,58 @@
 	private String successCntMonth;
 	private String successCntYear;
 
-	public String getSuccessDay() {
-		return successDay;
-	}
+	private List<Map<String, String>> varListMap;
 
-	public void setSuccessDay(String successDay) {
-		this.successDay = successDay;
-	}
-
-	public String getSuccessMonth() {
-		return successMonth;
-	}
-
-	public void setSuccessMonth(String successMonth) {
-		this.successMonth = successMonth;
-	}
-
-	public String getSuccessYear() {
-		return successYear;
-	}
-
-	public void setSuccessYear(String successYear) {
-		this.successYear = successYear;
-	}
-	
-	public String getSuccessCntDay() {
-		return successCntDay;
-	}
-
-	public void setSuccessCntDay(String successCntDay) {
-		this.successCntDay = successCntDay;
-	}
-
-	public String getSuccessCntMonth() {
-		return successCntMonth;
-	}
-
-	public void setSuccessCntMonth(String successCntMonth) {
-		this.successCntMonth = successCntMonth;
-	}
-
-	public String getSuccessCntYear() {
-		return successCntYear;
-	}
-
-	public void setSuccessCntYear(String successCntYear) {
-		this.successCntYear = successCntYear;
-	}
-	
-	public static long getSerialversionuid() {
-		return serialVersionUID;
-	}
-
-	public String getCategoryDepth() {
-		return categoryDepth;
-	}
-
-	public void setCategoryDepth(String categoryDepth) {
-		this.categoryDepth = categoryDepth;
-	}
-
-	public String getCategoryType() {
-		return categoryType;
-	}
-
-	public void setCategoryType(String categoryType) {
-		this.categoryType = categoryType;
-	}
-
-	public String getCategoryCode() {
-		return categoryCode;
-	}
-
-	public void setCategoryCode(String categoryCode) {
-		this.categoryCode = categoryCode;
-	}
-
-	public String getCategoryGroupName() {
-		return categoryGroupName;
-	}
-
-	public void setCategoryGroupName(String categoryGroupName) {
-		this.categoryGroupName = categoryGroupName;
-	}
-
-	public String getCategoryName() {
-		return categoryName;
-	}
-
-	public void setCategoryName(String categoryName) {
-		this.categoryName = categoryName;
-	}
-
-	public String getCategoryInclusion() {
-		return categoryInclusion;
-	}
-
-	public void setCategoryInclusion(String categoryInclusion) {
-		this.categoryInclusion = categoryInclusion;
-	}
-
-	public String getCategoryExclusion() {
-		return categoryExclusion;
-	}
-
-	public void setCategoryExclusion(String categoryExclusion) {
-		this.categoryExclusion = categoryExclusion;
-	}
-
-	public String getBizUrl() {
-		return bizUrl;
-	}
-	
-	public void setBizUrl(String bizUrl) {
-		this.bizUrl = bizUrl;
-	}
-
-	public String getBizReturnMsg() {
-		return bizReturnMsg;
-	}
-	
-	public void setBizReturnMsg(String bizReturnMsg) {
-		this.bizReturnMsg = bizReturnMsg;
-	}
-
-	public String getBizReturnCode() {
-		return bizReturnCode;
-	}
-	
-	public void setBizReturnCode(String bizReturnCode) {
-		this.bizReturnCode = bizReturnCode;
-	}
-
-	public String getPhoneNumber() {
-		return phoneNumber;
-	}
-	
-	public void setPhoneNumber(String phoneNumber) {
-		this.phoneNumber = phoneNumber;
-	}
-
-	public String getYellowId() {
-		return yellowId;
-	}
-	
-	public void setYellowId(String yellowId) {
-		this.yellowId = yellowId;
-	}
-
-	public String getBizJsonName() {
-		return bizJsonName;
-	}
-
-	public void setBizJsonName(String bizJsonName) {
-		this.bizJsonName = bizJsonName;
-	}
-
-	public String getToken() {
-		return token;
-	}
-
-	public void setToken(String token) {
-		this.token = token;
-	}
-
-	public String getSenderKey() {
-		return senderKey;
-	}
-
-	public void setSenderKey(String senderKey) {
-		this.senderKey = senderKey;
-	}
-
-	public String getProfileId() {
-		return profileId;
-	}
-
-	public void setProfileId(String profileId) {
-		this.profileId = profileId;
-	}
-
-	public String getUserId() {
-		return userId;
-	}
-
-	public void setUserId(String userId) {
-		this.userId = userId;
-	}
-
-	public String getImgTitle() {
-		return imgTitle;
-	}
-
-	public void setImgTitle(String imgTitle) {
-		this.imgTitle = imgTitle;
-	}
-
-	public String getImageType() {
-		return imageType;
-	}
-
-	public void setImageType(String imageType) {
-		this.imageType = imageType;
-	}
-
-	public String getImgLink() {
-		return imgLink;
-	}
-
-	public void setImgLink(String imgLink) {
-		this.imgLink = imgLink;
-	}
-
-	public String getTemplateName() {
-		return templateName;
-	}
-
-	public void setTemplateName(String templateName) {
-		this.templateName = templateName;
-	}
-
-	public String getTemplateMessageType() {
-		return templateMessageType;
-	}
-
-	public void setTemplateMessageType(String templateMessageType) {
-		this.templateMessageType = templateMessageType;
-	}
-
-	public String getTemplateEmphasizeType() {
-		return templateEmphasizeType;
-	}
-
-	public void setTemplateEmphasizeType(String templateEmphasizeType) {
-		this.templateEmphasizeType = templateEmphasizeType;
-	}
-
-	public String getTemplateContent() {
-		return templateContent;
-	}
-
-	public void setTemplateContent(String templateContent) {
-		this.templateContent = templateContent;
-	}
-
-	public String getTemplateExtra() {
-		return templateExtra;
-	}
-
-	public void setTemplateExtra(String templateExtra) {
-		this.templateExtra = templateExtra;
-	}
-
-	public String getTamplateAd() {
-		return tamplateAd;
-	}
-
-	public void setTamplateAd(String tamplateAd) {
-		this.tamplateAd = tamplateAd;
-	}
-
-	public String getTemplateImageName() {
-		return templateImageName;
-	}
-
-	public void setTemplateImageName(String templateImageName) {
-		this.templateImageName = templateImageName;
-	}
-
-	public String getTemplateImageUrl() {
-		return templateImageUrl;
-	}
-
-	public void setTemplateImageUrl(String templateImageUrl) {
-		this.templateImageUrl = templateImageUrl;
-	}
-
-	public String getTemplateTitle() {
-		return templateTitle;
-	}
-
-	public void setTemplateTitle(String templateTitle) {
-		this.templateTitle = templateTitle;
-	}
-
-	public String getTemplateSubtitle() {
-		return templateSubtitle;
-	}
-
-	public void setTemplateSubtitle(String templateSubtitle) {
-		this.templateSubtitle = templateSubtitle;
-	}
-
-	public String getTemplateHeader() {
-		return templateHeader;
-	}
-
-	public void setTemplateHeader(String templateHeader) {
-		this.templateHeader = templateHeader;
-	}
-
-	public Boolean getSecurityFlag() {
-		return securityFlag;
-	}
-
-	public void setSecurityFlag(Boolean securityFlag) {
-		this.securityFlag = securityFlag;
-	}
-
-	public List<KakaoButtonVO> getButtonVOList() {
-		return buttonVOList;
-	}
-
-	public void setButtonVOList(List<KakaoButtonVO> buttonVOList) {
-		this.buttonVOList = buttonVOList;
-	}
-
-	public String getButtonName() {
-		return buttonName;
-	}
-
-	public void setButtonName(String buttonName) {
-		this.buttonName = buttonName;
-	}
-
-	public String getButtonLinkType() {
-		return buttonLinkType;
-	}
-
-	public void setButtonLinkType(String buttonLinkType) {
-		this.buttonLinkType = buttonLinkType;
-	}
-
-	public String getButtonLinkAnd() {
-		return buttonLinkAnd;
-	}
-
-	public void setButtonLinkAnd(String buttonLinkAnd) {
-		this.buttonLinkAnd = buttonLinkAnd;
-	}
-
-	public String getButtonLinkIos() {
-		return buttonLinkIos;
-	}
-
-	public void setButtonLinkIos(String buttonLinkIos) {
-		this.buttonLinkIos = buttonLinkIos;
-	}
-
-	public String getButtonLinkMo() {
-		return buttonLinkMo;
-	}
-
-	public void setButtonLinkMo(String buttonLinkMo) {
-		this.buttonLinkMo = buttonLinkMo;
-	}
-
-	public String getButtonLinkPc() {
-		return buttonLinkPc;
-	}
-
-	public void setButtonLinkPc(String buttonLinkPc) {
-		this.buttonLinkPc = buttonLinkPc;
-	}
-
-	public String getButtonPluginId() {
-		return buttonPluginId;
-	}
-
-	public void setButtonPluginId(String buttonPluginId) {
-		this.buttonPluginId = buttonPluginId;
-	}
-
-	public String getQuickName() {
-		return quickName;
-	}
-
-	public void setQuickName(String quickName) {
-		this.quickName = quickName;
-	}
-
-	public String getQuickLinkType() {
-		return quickLinkType;
-	}
-
-	public void setQuickLinkType(String quickLinkType) {
-		this.quickLinkType = quickLinkType;
-	}
-
-	public String getQuickLinkAnd() {
-		return quickLinkAnd;
-	}
-
-	public void setQuickLinkAnd(String quickLinkAnd) {
-		this.quickLinkAnd = quickLinkAnd;
-	}
-
-	public String getQuickLinkIos() {
-		return quickLinkIos;
-	}
-
-	public void setQuickLinkIos(String quickLinkIos) {
-		this.quickLinkIos = quickLinkIos;
-	}
-
-	public String getQuickLinkMo() {
-		return quickLinkMo;
-	}
-
-	public void setQuickLinkMo(String quickLinkMo) {
-		this.quickLinkMo = quickLinkMo;
-	}
-
-	public String getQuickLinkPc() {
-		return quickLinkPc;
-	}
-
-	public void setQuickLinkPc(String quickLinkPc) {
-		this.quickLinkPc = quickLinkPc;
-	}
-
-	public String getSenderKeyType() {
-		return senderKeyType;
-	}
-
-	public void setSenderKeyType(String senderKeyType) {
-		this.senderKeyType = senderKeyType;
-	}
-
-	public String getDeleteYn() {
-		return deleteYn;
-	}
-
-	public void setDeleteYn(String deleteYn) {
-		this.deleteYn = deleteYn;
-	}
-
-	public String getTemplateCode() {
-		return templateCode;
-	}
-
-	public void setTemplateCode(String templateCode) {
-		this.templateCode = templateCode;
-	}
-
-	public String getNewTemplateCode() {
-		return newTemplateCode;
-	}
-
-	public void setNewTemplateCode(String newTemplateCode) {
-		this.newTemplateCode = newTemplateCode;
-	}
-
-	public String[] getArrTemplateCode() {
-		return arrTemplateCode;
-	}
-
-	public void setArrTemplateCode(String[] arrTemplateCode) {
-		this.arrTemplateCode = arrTemplateCode;
-	}
-
-	public String getTemplateStatus() {
-		return templateStatus;
-	}
-
-	public void setTemplateStatus(String templateStatus) {
-		this.templateStatus = templateStatus;
-	}
-
-	public String getKeyword() {
-		return keyword;
-	}
-
-	public void setKeyword(String keyword) {
-		this.keyword = keyword;
-	}
-
-	public String getSendPhone() {
-		return sendPhone;
-	}
-
-	public void setSendPhone(String sendPhone) {
-		this.sendPhone = sendPhone;
-	}
-
-	public String getDestPhone() {
-		return destPhone;
-	}
-
-	public void setDestPhone(String destPhone) {
-		this.destPhone = destPhone;
-	}
-
-	public String getSubMsgSendYn() {
-		return subMsgSendYn;
-	}
-
-	public void setSubMsgSendYn(String subMsgSendYn) {
-		this.subMsgSendYn = subMsgSendYn;
-	}
-
-	public String getCount() {
-		return count;
-	}
-
-	public void setCount(String count) {
-		this.count = count;
-	}
-
-	public String getPage() {
-		return page;
-	}
-
-	public void setPage(String page) {
-		this.page = page;
-	}
-
-	public String getBizUmid() {
-		return bizUmid;
-	}
-
-	public void setBizUmid(String bizUmid) {
-		this.bizUmid = bizUmid;
-	}
-
-	public List<String> getVarNmList() {
-		return varNmList;
-	}
-
-	public void setVarNmList(List<String> varNmList) {
-		this.varNmList = varNmList;
-	}
-
-	public List<String[]> getVarValList() {
-		return varValList;
-	}
-
-	public void setVarValList(List<String[]> varValList) {
-		this.varValList = varValList;
-	}
-
-	public String getFormListType() {
-		return formListType;
-	}
-
-	public void setFormListType(String formListType) {
-		this.formListType = formListType;
-	}
-
-	public String getSubMsgTxt() {
-		return subMsgTxt;
-	}
-
-	public void setSubMsgTxt(String subMsgTxt) {
-		this.subMsgTxt = subMsgTxt;
-	}
-
-	public String getBizJsonYn() {
-		return bizJsonYn;
-	}
-
-	public void setBizJsonYn(String bizJsonYn) {
-		this.bizJsonYn = bizJsonYn;
-	}
-
-	public String getSendType() {
-		return sendType;
-	}
-
-	public void setSendType(String sendType) {
-		this.sendType = sendType;
-	}
-
-	public String getAdFlag() {
-		return adFlag;
-	}
-
-	public void setAdFlag(String adFlag) {
-		this.adFlag = adFlag;
-	}
-
-	public List<KakaoVO> getKakaoSendList() {
-		return kakaoSendList;
-	}
-
-	public void setKakaoSendList(List<KakaoVO> kakaoSendList) {
-		this.kakaoSendList = kakaoSendList;
-	}
-
-	public String getSubMsgTxtReplYn() {
-		return subMsgTxtReplYn;
-	}
-
-	public void setSubMsgTxtReplYn(String subMsgTxtReplYn) {
-		this.subMsgTxtReplYn = subMsgTxtReplYn;
-	}
-	
-	public String getSubMsgType() {
-		return subMsgType;
-	}
-
-	public void setSubMsgType(String subMsgType) {
-		this.subMsgType = subMsgType;
-	}
-	public List<String[]> varValPaser(String[] varValList){
-		
-		List<String[]> returnVarVal = new ArrayList<>();
-		
-		for(String varVal : varValList)
-		{
-			String[] strList = varVal.split("§");
-			returnVarVal.add(strList);
+	@Override
+	public String toString() {
+		String varListMapString = "[";
+		if (varListMap != null && !varListMap.isEmpty()) {
+			StringBuilder sb = new StringBuilder();
+			for (Map<String, String> map : varListMap) {
+				if (sb.length() > 0)
+					sb.append(", ");
+				if (map == null) {
+					sb.append("null");
+				} else {
+					sb.append("{");
+					String prefix = "";
+					for (Map.Entry<String, String> entry : map.entrySet()) {
+						sb.append(prefix).append(entry.getKey()).append("=").append(entry.getValue());
+						prefix = ", ";
+					}
+					sb.append("}");
+				}
+			}
+			varListMapString += sb.toString();
 		}
+		varListMapString += "]";
 		
-		return returnVarVal;
+		return "KakaoSendAdvcVO[" +
+			"\n senderKey=[" + senderKey + "]" +
+			"\n , subMsgTxtReplYn=[" + subMsgTxtReplYn + "]" +
+			"\n , subMsgSendYn=[" + subMsgSendYn + "]" +
+			"\n , reserveYn=[" + getReserveYn() + "]" +
+			"\n , divideCnt=[" + getDivideCnt() + "]" +
+			"\n , bizJsonYn=[" + bizJsonYn + "]" +
+			"\n , templateEmphasizeType=[" + templateEmphasizeType + "]" +
+			"\n , templateSubtitle=[" + templateSubtitle + "]" +
+			"\n , txtReplYn=[" + getTxtReplYn() + "]" +
+			"\n , callFrom=[" + getCallFrom() + "]" +
+			"\n , templateCode=[" + templateCode + "]" +
+			"\n , divideTime=[" + getDivideTime() + "]" +
+			"\n , reqDate=[" + getReqDate() + "]" +
+			"\n , atSmishingYn=[" + getAtSmishingYn() + "]" +
+			"\n , menuTopTab=[" + menuTopTab + "]" +
+			"\n , templateContent=[" + templateContent + "]" +
+			"\n , templateTitle=[" + templateTitle + "]" +
+			"\n , subMsgTxt=[" + subMsgTxt + "]" +
+			"\n , divideChk=[" + getDivideChk() + "]" +
+			"\n , sendType=[" + sendType + "]" +
+			"\n , msgType=[" + getMsgType() + "]" +
+			"\n , userId=[" + userId + "]" +
+			"\n , varListMap=[" + varListMapString + "]" +
+			"\n ]";
 	}
-
-	public String getMenuTopTab() {
-		return menuTopTab;
-	}
-
-	public void setMenuTopTab(String menuTopTab) {
-		this.menuTopTab = menuTopTab;
-	}
-
-	public String getMenuSubTab() {
-		return menuSubTab;
-	}
-
-	public void setMenuSubTab(String menuSubTab) {
-		this.menuSubTab = menuSubTab;
-	}
-
-	public String getSearchCondition2() {
-		return searchCondition2;
-	}
-
-	public void setSearchCondition2(String searchCondition2) {
-		this.searchCondition2 = searchCondition2;
-	}
-
-	public String getKakaoResendSuccCount() {
-		return kakaoResendSuccCount;
-	}
-
-	public void setKakaoResendSuccCount(String kakaoResendSuccCount) {
-		this.kakaoResendSuccCount = kakaoResendSuccCount;
-	}
-
-	public String getKakaoResendFailCount() {
-		return kakaoResendFailCount;
-	}
-
-	public void setKakaoResendFailCount(String kakaoResendFailCount) {
-		this.kakaoResendFailCount = kakaoResendFailCount;
-	}
-
-	public String getAtSuccessCount() {
-		return atSuccessCount;
-	}
-
-	public void setAtSuccessCount(String atSuccessCount) {
-		this.atSuccessCount = atSuccessCount;
-	}
-
-	public String getFtSuccessCount() {
-		return ftSuccessCount;
-	}
-
-	public void setFtSuccessCount(String ftSuccessCount) {
-		this.ftSuccessCount = ftSuccessCount;
-	}
-
-	public String getAtFailCount() {
-		return atFailCount;
-	}
-
-	public void setAtFailCount(String atFailCount) {
-		this.atFailCount = atFailCount;
-	}
-
-	public String getFtFailCount() {
-		return ftFailCount;
-	}
-
-	public void setFtFailCount(String ftFailCount) {
-		this.ftFailCount = ftFailCount;
-	}
-
-	public String getAtSuccPrice() {
-		return atSuccPrice;
-	}
-
-	public void setAtSuccPrice(String atSuccPrice) {
-		this.atSuccPrice = atSuccPrice;
-	}
-
-	public String getFtSuccPrice() {
-		return ftSuccPrice;
-	}
-
-	public void setFtSuccPrice(String ftSuccPrice) {
-		this.ftSuccPrice = ftSuccPrice;
-	}
-
-	public String getAtFailPrice() {
-		return atFailPrice;
-	}
-
-	public void setAtFailPrice(String atFailPrice) {
-		this.atFailPrice = atFailPrice;
-	}
-
-	public String getFtFailPrice() {
-		return ftFailPrice;
-	}
-
-	public void setFtFailPrice(String ftFailPrice) {
-		this.ftFailPrice = ftFailPrice;
-	}
-
-	public String getKakaoResendSuccPrice() {
-		return kakaoResendSuccPrice;
-	}
-
-	public void setKakaoResendSuccPrice(String kakaoResendSuccPrice) {
-		this.kakaoResendSuccPrice = kakaoResendSuccPrice;
-	}
-
-	public String getKakaoResendFailPrice() {
-		return kakaoResendFailPrice;
-	}
-
-	public void setKakaoResendFailPrice(String kakaoResendFailPrice) {
-		this.kakaoResendFailPrice = kakaoResendFailPrice;
-	}
-
-	public String getAtSuccCntSum() {
-		return atSuccCntSum;
-	}
-
-	public void setAtSuccCntSum(String atSuccCntSum) {
-		this.atSuccCntSum = atSuccCntSum;
-	}
-
-	public String getFtSuccCntSum() {
-		return ftSuccCntSum;
-	}
-
-	public void setFtSuccCntSum(String ftSuccCntSum) {
-		this.ftSuccCntSum = ftSuccCntSum;
-	}
-
-	public String getAtFailCntSum() {
-		return atFailCntSum;
-	}
-
-	public void setAtFailCntSum(String atFailCntSum) {
-		this.atFailCntSum = atFailCntSum;
-	}
-
-	public String getFtFailCntSum() {
-		return ftFailCntSum;
-	}
-
-	public void setFtFailCntSum(String ftFailCntSum) {
-		this.ftFailCntSum = ftFailCntSum;
-	}
-
-	public String getKakaoResenSuccSum() {
-		return kakaoResenSuccSum;
-	}
-
-	public void setKakaoResenSuccSum(String kakaoResenSuccSum) {
-		this.kakaoResenSuccSum = kakaoResenSuccSum;
-	}
-
-	public String getKakaoResenFailSum() {
-		return kakaoResenFailSum;
-	}
-
-	public void setKakaoResenFailSum(String kakaoResenFailSum) {
-		this.kakaoResenFailSum = kakaoResenFailSum;
-	}
-
-	public String getAtSuccPriceSum() {
-		return atSuccPriceSum;
-	}
-
-	public void setAtSuccPriceSum(String atSuccPriceSum) {
-		this.atSuccPriceSum = atSuccPriceSum;
-	}
-
-	public String getFtSuccPriceSum() {
-		return ftSuccPriceSum;
-	}
-
-	public void setFtSuccPriceSum(String ftSuccPriceSum) {
-		this.ftSuccPriceSum = ftSuccPriceSum;
-	}
-
-	public String getAtFailPriceSum() {
-		return atFailPriceSum;
-	}
-
-	public void setAtFailPriceSum(String atFailPriceSum) {
-		this.atFailPriceSum = atFailPriceSum;
-	}
-
-	public String getFtFailPriceSum() {
-		return ftFailPriceSum;
-	}
-
-	public void setFtFailPriceSum(String ftFailPriceSum) {
-		this.ftFailPriceSum = ftFailPriceSum;
-	}
-
-	public String getKakaoResendSuccPriceSum() {
-		return kakaoResendSuccPriceSum;
-	}
-
-	public void setKakaoResendSuccPriceSum(String kakaoResendSuccPriceSum) {
-		this.kakaoResendSuccPriceSum = kakaoResendSuccPriceSum;
-	}
-
-	public String getKakaoResendFailPriceSum() {
-		return kakaoResendFailPriceSum;
-	}
-
-	public void setKakaoResendFailPriceSum(String kakaoResendFailPriceSum) {
-		this.kakaoResendFailPriceSum = kakaoResendFailPriceSum;
-	}
-
-	public String getFriendId() {
-		return friendId;
-	}
-
-	public void setFriendId(String friendId) {
-		this.friendId = friendId;
-	}
-
-	public String getImageTitle() {
-		return imageTitle;
-	}
-
-	public void setImageTitle(String imageTitle) {
-		this.imageTitle = imageTitle;
-	}
-
-	public String getImageLink() {
-		return imageLink;
-	}
-
-	public void setImageLink(String imageLink) {
-		this.imageLink = imageLink;
-	}
-
-	public String getJsonText() {
-		return jsonText;
-	}
-
-	public void setJsonText(String jsonText) {
-		this.jsonText = jsonText;
-	}
-
-	public String getImageFileName() {
-		return imageFileName;
-	}
-
-	public void setImageFileName(String imageFileName) {
-		this.imageFileName = imageFileName;
-	}
-
-	public String getSbscrbDe() {
-		return sbscrbDe;
-	}
-
-	public void setSbscrbDe(String sbscrbDe) {
-		this.sbscrbDe = sbscrbDe;
-	}
-
-	public String getMoblphonNo() {
-		return moblphonNo;
-	}
-
-	public void setMoblphonNo(String moblphonNo) {
-		this.moblphonNo = moblphonNo;
-	}
-
-	public String getDept() {
-		return dept;
-	}
-
-	public void setDept(String dept) {
-		this.dept = dept;
-	}
-
-	public String getAtchFileId() {
-		return atchFileId;
-	}
-
-	public void setAtchFileId(String atchFileId) {
-		this.atchFileId = atchFileId;
-	}
-
-	public String getWorkAtchFileId() {
-		return workAtchFileId;
-	}
-
-	public void setWorkAtchFileId(String workAtchFileId) {
-		this.workAtchFileId = workAtchFileId;
-	}
-
-	public String getFileSn() {
-		return fileSn;
-	}
-
-	public void setFileSn(String fileSn) {
-		this.fileSn = fileSn;
-	}
-
-	public String getFileCn() {
-		return fileCn;
-	}
-
-	public void setFileCn(String fileCn) {
-		this.fileCn = fileCn;
-	}
-
-	public String getFileStreCours() {
-		return fileStreCours;
-	}
-
-	public void setFileStreCours(String fileStreCours) {
-		this.fileStreCours = fileStreCours;
-	}
-
-	public String getOrignlFileNm() {
-		return orignlFileNm;
-	}
-
-	public void setOrignlFileNm(String orignlFileNm) {
-		this.orignlFileNm = orignlFileNm;
-	}
-
-	public String getStreFileNm() {
-		return streFileNm;
-	}
-
-	public void setStreFileNm(String streFileNm) {
-		this.streFileNm = streFileNm;
-	}
-
-	public String getFileExtsn() {
-		return fileExtsn;
-	}
-
-	public void setFileExtsn(String fileExtsn) {
-		this.fileExtsn = fileExtsn;
-	}
-
-	public String getFileSize() {
-		return fileSize;
-	}
-
-	public void setFileSize(String fileSize) {
-		this.fileSize = fileSize;
-	}
-
-	public int getStartCount() {
-		return startCount;
-	}
-
-	public void setStartCount(int startCount) {
-		this.startCount = startCount;
-	}
-
-	public int getEndCount() {
-		return endCount;
-	}
-
-	public void setEndCount(int endCount) {
-		this.endCount = endCount;
-	}
-
-	public String getPhmType() {
-		return phmType;
-	}
-
-	public void setPhmType(String phmType) {
-		this.phmType = phmType;
-	}
+	
+	
 }
src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java
--- src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java
+++ src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java
@@ -32,7 +32,124 @@
 	
 	static String json;
 	
-	@SuppressWarnings("unchecked")
+	public String kakaoApiJsonSave_advc(KakaoVO kakaoVO, String[] varValInfo) {
+		// json파일 저장
+		
+		
+		Date nowDate = new Date();
+		SimpleDateFormat todayFrom = new SimpleDateFormat("yyyyMMdd");
+		SimpleDateFormat timeFrom = new SimpleDateFormat("HHmmss");
+		String jsonFileName = mjonBizJsonDir+"/"+kakaoVO.getUserId()+"/"+todayFrom.format(nowDate)+"/"+kakaoVO.getSendType(); // 아이디/날짜/타입
+		
+		String fileName = timeFrom.format(nowDate)+"_"+kakaoVO.getDestPhone()+".json";
+		
+		
+//		File userIdFile = new File(jsonFileName);
+//		if(!userIdFile.exists()) {
+//			userIdFile.mkdirs(); // 없으면 하위 디렉토리 까지 생성
+//			jsonFileName = jsonFileName +"/"+fileName;
+//		}else {
+//			
+//			jsonFileName = jsonFileName +"/"+fileName;
+//			System.out.println("jsonFileName  : "+jsonFileName);
+//			File file1 = new File(jsonFileName);
+//			if (file1.isFile()) {
+//				return jsonFileName;
+//			}
+//		}
+		
+		KakaoReturnVO templateDetail = kakaoApiTemplate.selectKakaoApiTemplateDetail(kakaoVO);
+		
+		// 버튼리스트 JSON 생성
+		JSONArray buttonList = new JSONArray();
+		for(KakaoButtonVO buttonInfoVO : templateDetail.getButtonList()) {
+			JSONObject buttonInfo = new JSONObject();
+			
+			buttonInfo.put("name", buttonInfoVO.getName());
+			buttonInfo.put("type", buttonInfoVO.getLinkType());
+			
+			if(buttonInfoVO.getLinkType().equals("WL")) {
+				buttonInfo.put("url_mobile", buttonInfoVO.getLinkMo());
+				buttonInfo.put("url_pc", buttonInfoVO.getLinkPc());
+			}else if(buttonInfoVO.getLinkType().equals("AL")) {
+				buttonInfo.put("scheme_ios", buttonInfoVO.getLinkIos());
+				buttonInfo.put("scheme_android", buttonInfoVO.getLinkAnd());
+			}else if(buttonInfoVO.getLinkType().equals("BC")) {
+				// 상담톡 진행시 등록해야함
+			}else if(buttonInfoVO.getLinkType().equals("BT")) {
+				// 봇 전환 시 전달
+			}
+			buttonList.add(buttonInfo);
+		}
+		
+		// 강조유형 JSON 생성
+		JSONObject templateDetailInfo = new JSONObject();
+		String emphasizeType = templateDetail.getTemplateEmphasizeType();
+		
+		if(emphasizeType.equals("TEXT")) {
+			
+			String templateTitle =  templateDetail.getTemplateTitle();
+			if(kakaoVO.getVarNmList().size() != 0) {
+				String[] varNm = new String[kakaoVO.getVarNmList().size()];
+				int q=0;
+				for(String temp : kakaoVO.getVarNmList()) {
+					temp = temp.replaceAll("\\#\\{" , "§§");
+					temp = temp.replaceAll("\\}" , "§");
+					varNm[q] = temp;
+					q++;
+				}
+				List<String[]> varValList = kakaoVO.getVarValList(); // value 값
+				
+				templateTitle = templateTitle.replaceAll(String.valueOf((char)13), "");
+				templateTitle = templateTitle.replaceAll("\\#\\{" , "§§");
+				templateTitle = templateTitle.replaceAll("\\}" , "§");
+				
+				for(int i=0; i < varNm.length; i++) {
+					for(int j=0; j < varValInfo.length; j++) {
+						if (templateTitle.indexOf(varNm[i]) > -1) {
+			 				if(varValInfo[j] != null) {
+			 					templateTitle = templateTitle.replaceAll(varNm[i] , StringUtil.getString(varValInfo[j]));
+			 				}else {
+			 					templateTitle = templateTitle.replaceAll(varNm[i] , "");
+			 				}
+			 			}
+					}
+				}
+				
+				templateDetailInfo.put("title", templateTitle);
+			}else {
+				templateDetailInfo.put("title", templateTitle);
+			}
+		}else if(emphasizeType.equals("IMAGE")) {
+			templateDetailInfo.put("msg_type", "ai");
+		}else if(emphasizeType.equals("NONE")) {
+			
+		}
+		
+		
+		JSONObject jo = new JSONObject();
+		
+		if(buttonList.size() != 0) {
+			jo.put("button", buttonList);
+		}
+		if(templateDetailInfo.size() != 0) {
+			jo.put("extra", templateDetailInfo);
+		}
+		
+		// 입력 json 데이터를 파일로 변경
+		String jsonStr = jo.toString();
+//		System.out.println("jsonStr  : "+jsonStr);
+	
+//			File outPut = new File(jsonFileName);
+//			outPut.createNewFile();
+		
+//			BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outPut), "utf-8"));
+//			bw.write(jsonStr);
+//			bw.close();
+		
+		return jsonFileName;
+	}
+	
 	public String kakaoApiJsonSave(KakaoVO kakaoVO, String[] varValInfo) {
 		// json파일 저장
 		
@@ -109,12 +226,12 @@
 					for(int i=0; i < varNm.length; i++) {
 						for(int j=0; j < varValInfo.length; j++) {
 							if (templateTitle.indexOf(varNm[i]) > -1) {
-				 				if(varValInfo[j] != null) {
-				 					templateTitle = templateTitle.replaceAll(varNm[i] , StringUtil.getString(varValInfo[j]));
-				 				}else {
-				 					templateTitle = templateTitle.replaceAll(varNm[i] , "");
-				 				}
-				 			}
+								if(varValInfo[j] != null) {
+									templateTitle = templateTitle.replaceAll(varNm[i] , StringUtil.getString(varValInfo[j]));
+								}else {
+									templateTitle = templateTitle.replaceAll(varNm[i] , "");
+								}
+							}
 						}
 					}
 					
@@ -140,8 +257,8 @@
 			
 			// 입력 json 데이터를 파일로 변경
 			String jsonStr = jo.toString();
-			System.out.println("jsonFileName  : "+jsonFileName);
-		
+//			System.out.println("jsonFileName  : "+jsonFileName);
+			
 			File outPut = new File(jsonFileName);
 			outPut.createNewFile();
 			
src/main/java/itn/let/kakao/user/kakaoAt/service/KakaoAlimTalkService.java
--- src/main/java/itn/let/kakao/user/kakaoAt/service/KakaoAlimTalkService.java
+++ src/main/java/itn/let/kakao/user/kakaoAt/service/KakaoAlimTalkService.java
@@ -2,7 +2,11 @@
 
 import java.util.List;
 
+import javax.servlet.http.HttpServletRequest;
+
+import itn.let.kakao.kakaoComm.KakaoSendAdvcVO;
 import itn.let.kakao.kakaoComm.KakaoVO;
+import itn.let.mail.service.StatusResponse;
 import itn.let.mjo.msgdata.service.MjonMsgReturnVO;
 
 public interface KakaoAlimTalkService {
@@ -24,5 +28,7 @@
 	
 	//카카오 친구톡 전송 실패 환불리스트 조회
 	public void selectKakaoFtSentRefundList() throws Exception;
+
+	StatusResponse insertKakaoAtSandAjax_advc(KakaoVO kakaoVO, HttpServletRequest request) throws Exception;
 	
 }
src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkServiceImpl.java
--- src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkServiceImpl.java
+++ src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkServiceImpl.java
@@ -4,16 +4,27 @@
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Service;
 
 import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
 import egovframework.rte.fdl.idgnr.EgovIdGnrService;
+import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
+import itn.com.cmm.LoginVO;
+import itn.com.utl.fcc.service.EgovStringUtil;
+import itn.let.kakao.kakaoComm.KakaoSendAdvcVO;
+import itn.let.kakao.kakaoComm.KakaoSendUtil;
 import itn.let.kakao.kakaoComm.KakaoVO;
 import itn.let.kakao.user.kakaoAt.service.KakaoAlimTalkService;
+import itn.let.mail.service.StatusResponse;
 import itn.let.mjo.mjocommon.MjonHolidayApi;
 import itn.let.mjo.msg.service.MjonMsgVO;
 import itn.let.mjo.msg.service.impl.MjonMsgDAO;
@@ -24,9 +35,13 @@
 import itn.let.mjo.msgholiday.service.impl.MsgHolidayDAO;
 import itn.let.mjo.pay.service.MjonPayService;
 import itn.let.mjo.pay.service.MjonPayVO;
+import itn.let.module.base.PriceAndPoint;
 import itn.let.sym.site.service.JoinSettingVO;
 import itn.let.sym.site.service.impl.SiteManagerDAO;
+import itn.let.uss.umt.service.EgovUserManageService;
+import lombok.extern.slf4j.Slf4j;
 
+@Slf4j
 @Service("kakaoAlimTalkService")
 public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements KakaoAlimTalkService{
 
@@ -53,6 +68,16 @@
 	
 	@Resource(name = "egovMjonCashIdGnrService")
 	private EgovIdGnrService idgenMjonCashId;
+
+	/** userManageService */
+	@Resource(name = "userManageService")
+	private EgovUserManageService userManageService;
+
+	@Autowired
+	private PriceAndPoint priceAndPoint;
+
+	@Autowired
+	KakaoSendUtil kakaoSendUtil;
 	
 	//발신프로필 상태값 변경(삭제/복구 기능)
 	@Override
@@ -816,4 +841,119 @@
 			}
 		}
 	}
+
+	@Override
+	public StatusResponse insertKakaoAtSandAjax_advc(KakaoVO kakaoVO, HttpServletRequest request) throws Exception {
+
+//		log.info(" :: [{}]", kakaoVO.toString());
+
+//		KakaoSendAdvcVO
+		
+		Map<String, Object> returnMap = new HashMap<>();
+
+		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()
+				? (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser()
+				: null;
+		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
+
+		if (userId.equals("")) {
+			return new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용이 가능합니다.");
+		}
+		
+
+		/**
+		 * 회원 정지된 상태이면 문자 발송이 안되도록 처리함 현재 로그인 세션도 만료 처리함
+		 */
+		boolean mberSttus = userManageService.selectUserStatusInfo(userId);
+		if (!mberSttus) {
+			request.getSession().invalidate();
+			// UNAUTHORIZED : 인증되지 않은 사용자가 접근하려고 할 때
+			return new StatusResponse(HttpStatus.UNAUTHORIZED,
+					"현재 고객님께서는 문자온 서비스 이용이 정지된 상태로 알림톡을 발송하실 수 없습니다. 이용정지 해제를 원하시면 고객센터로 연락주시기 바랍니다.");
+		}
+		
+
+		StatusResponse statusResponse = new StatusResponse();
+
+		
+/** 카카오톡 전송 기본 설정 -------------------------------------------*/
+		kakaoVO.setSendType("AT");
+		kakaoVO.setMsgType("8");
+		kakaoVO.setUserId(userId);
+				
+			
+/** 전송금액 설정 --------------------------------------------------*/
+//		KakaoVO priceSet = kakaoSendUtil.populateSendLists(kakaoVO, statusResponse);
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+/** 카카오톡 전송 기본 설정 -------------------------------------------*/
+		kakaoVO.setSendType("AT");
+		kakaoVO.setMsgType("8");
+		kakaoVO.setUserId(userId);
+		
+		
+		
+//		priceAndPoint.getBefCash(userId);
+		
+		
+		
+		
+		
+		return statusResponse;
+	}
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
 }
src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkSendController.java
--- src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkSendController.java
+++ src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkSendController.java
@@ -35,9 +35,11 @@
 import org.apache.poi.xssf.usermodel.XSSFSheet;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -57,6 +59,7 @@
 import itn.com.cmm.util.StringUtil;
 import itn.com.utl.fcc.service.EgovStringUtil;
 import itn.let.kakao.kakaoComm.KakaoReturnVO;
+import itn.let.kakao.kakaoComm.KakaoSendAdvcVO;
 import itn.let.kakao.kakaoComm.KakaoSendUtil;
 import itn.let.kakao.kakaoComm.KakaoVO;
 import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiJsonSave;
@@ -65,6 +68,7 @@
 import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiTemplate;
 import itn.let.kakao.kakaoComm.kakaoApi.service.KakaoApiService;
 import itn.let.kakao.user.kakaoAt.service.KakaoAlimTalkService;
+import itn.let.mail.service.StatusResponse;
 import itn.let.mjo.mjocommon.MjonCommon;
 import itn.let.mjo.mjocommon.MjonHolidayApi;
 import itn.let.mjo.msgdata.service.MjonMsgDataService;
@@ -1057,6 +1061,16 @@
 		return modelAndView;
 	}
 	
+	@RequestMapping(value= {"/web/mjon/kakao/alimtalk/kakaoAlimTalkMsgSendAjax_advc.do"}, method = RequestMethod.POST)
+	public ResponseEntity<StatusResponse> kakaoAlimTalkMsgSendAjax_advc(
+			@RequestBody KakaoVO kakaoVO,
+			HttpServletRequest request
+			) throws Exception {
+
+		System.out.println(" + kakaoAlimTalkMsgSendAjax_advc + ");
+		return ResponseEntity.ok().body(kakaoAlimTalkService.insertKakaoAtSandAjax_advc(kakaoVO, request)) ;
+	}
+	
 	@RequestMapping(value= {"/web/mjon/kakao/alimtalk/kakaoAlimTalkMsgSendAjax.do"}, method = RequestMethod.POST)
 //	@ResponseBody
 	public ModelAndView kakaoAlimTalkMsgSendAjax(
@@ -1064,6 +1078,10 @@
 			HttpServletRequest request,
 			@ModelAttribute("kakaoVO")  KakaoVO kakaoVO
 		) throws Exception {
+		// 시작 시간
+        long startTime = System.currentTimeMillis();
+		
+		System.out.println(" :: kakaoAlimTalkMsgSendAjax :: ");
 		ModelAndView modelAndView = new ModelAndView();		
 		modelAndView.setViewName("jsonView");
 		
@@ -1108,6 +1126,10 @@
 			
 /** 전송금액 설정 --------------------------------------------------*/
 			KakaoVO priceSet = kakaoSendUtil.kakaoSendPrice(kakaoVO);
+			
+			if (true) {
+			    throw new IllegalStateException("배열 크기 초과");
+			}
 			
 			
 			if(priceSet.getResultCode() != null && priceSet.getResultCode().equals("2000")) {
@@ -1400,6 +1422,17 @@
 		} catch (Exception e) {
 			throw new Exception("++++++++++++++++++++++ getAdminPhoneSendMsgData Error !!! " + e);
 		}
+		// 종료 시간
+		long endTime = System.currentTimeMillis();
+		
+// 실행 시간 계산 (초 단위)
+		double executionTimeSeconds = (endTime - startTime) / 1000.0;
+		
+		System.out.println("실행 시간: " + String.format("%.3f", executionTimeSeconds) + "초");
+		
+		
+		String returnTxt = String.format("%.3f", executionTimeSeconds) + "초";
+		modelAndView.addObject("seconds", returnTxt);
 		
 		return modelAndView;
 	}
src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView.jsp
--- src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView.jsp
+++ src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView.jsp
@@ -550,7 +550,7 @@
 	
 	// 초기화
 	$('.varValList').remove();
-	$('#bizForm #varNmList').val('');
+// 	$('#bizForm #varNmList').val('');
 
 
 	// 대체문자 전송 확인
@@ -613,125 +613,110 @@
 	}else{
 		$('#bizForm #reqDate').val("");
 	}
-	
+
+    var dataList = [];
 	// 치환문자 있는 데이터 파씽
 	if($('#bizForm #txtReplYn').val() === 'Y'){
-		fn_excelDataTransParsing();
+		// fn_excelDataTransParsing();
 		// 치환문자 있는 수신자 리스트 
-		fn_transCallToListParsing();
+		dataList = fn_transCallToListParsing();
 	}else{
-		// 치환문자 없는 수신자 리스트 
-		fn_callToListParsing();
+		// 치환문자 없는 수신자 리스트
+		dataList = fn_callToListParsing();
 	}
 
-	$('#bizForm #senderKey').val($('#selectKakaoProfileList').val());
-	$('#bizForm #templateCode').val($('#selectTemplateList').val());
 	
+	
+	
+	
+	// 채널 ID
+	$('#bizForm #senderKey').val($('#selectKakaoProfileList').val());
+    // 채널 > 템플릿
+	$('#bizForm #templateCode').val($('#selectTemplateList').val());
 	// 발신번호
 	$('#bizForm #callFrom').val(removeDash($('#callFromList option:selected').val()));
 	
-	if(confirm("알림톡을 발송하시겠습니까?")){
-		var spamChk = true;
-		//2023.09.06 알림톡 스팸체크 기능 제거요청으로 인한 주석처리
-		/*var spamChk = false;
-		var spmData = new FormData(document.bizForm);
-		$.ajax({
-			type: "POST"
-			, url: "/web/mjon/alimtalk/selectSpamKakaoAlimtalkMsgChkAjax.do"
-			, data: spmData
-			, dataType:'json'
-			, async: false
-			, processData: false
-			, contentType: false
-			, cache: false
-			, success: function (returnData, status) {
-				if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나
-					
-					if("fail" == returnData.result){
-						alert(returnData.message);
-						return false;
-					}else if("loginFail" == returnData.result){
-						alert(returnData.message);
-						return false;
-					}else if("spams" == returnData.result){
-						alert("전송 내용에  스팸문구가 포함되어 있습니다.")
-						return false;
-					}else{
-						spamChk = true;
-						return false;
-					}
-					
-				} else if(status== 'fail'){
-					alert(returnData.message);
-					return false;
-				}
-			}
-			, error: function (e) {
-				alert("문자 발송에 실패하였습니다.");
-				console.log("ERROR : ", e);
-				return false;
-			}
-		}); */
-		
-		if(spamChk){
-			var data = new FormData(document.bizForm);
-			$.ajax({
-				type: "POST"
-				, url: "/web/mjon/kakao/alimtalk/kakaoAlimTalkMsgSendAjax.do"
-				, data: data
-				, dataType: 'json'
-				, async: true
-				, processData: false
-				, contentType: false
-				, cache: false
-				, success: function (returnData, status) {
-					if(status == 'success'){
-						if("loginFail" == returnData.result){
-							
-							alert(returnData.message);
-							return false;
-							
-						}else  if('fail' == returnData.result){
-							
-							alert(returnData.message);
-							return false;
-							
-						}else if('authFail' == returnData.result){
-							
-							alert(returnData.message);
-							location.reload();
-							
-						} else if(status == 'success'){
-							
-							var kakaoSendCnt = returnData.resultSts;
-							
-							$('.pop_msg_success').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'});
-							
-							//예약발송 건의 경우 결과 팝업 문구 변경
-							if(reserYn == 'Y'){
-								$('.pop_msg_success .msg_text').html("예약 성공 : <strong>"+ kakaoSendCnt + "</strong>건의<br>알림톡이 예약 되었습니다.");
-							}else{
-								$('.pop_msg_success .msg_text').html("발송 성공 : <strong>"+ kakaoSendCnt + "</strong>건의<br>알림톡이 발송 되었습니다.");
-							}
-							
-							$('.mask').addClass('on');
-						}
-					}
-				}
-				,beforeSend : function(xmlHttpRequest) {
-					//로딩창 show
-					$('.loading_layer').addClass('active');
-				}
-				,complete : function(xhr, textStatus) {
-					//로딩창 hide
-					$('.loading_layer').removeClass('active');
-				}
-				,error: function (e) {
-					console.log("ERROR : ", e);
-					alert("카카오 알림톡 전송에 실패하였습니다.");
-				}
-			}); 
+	// 폼 데이터를 배열로 직렬화
+	var form = $('#bizForm');
+	var formDataArray = form.serializeArray();
+	
+	// 배열을 객체로 변환
+	var formData = {};
+	$.each(formDataArray, function(index, field) {
+	    formData[field.name] = field.value;
+	});
+	
+	// 빈 값 제거 (참고 코드 기반)
+	for (var key in formData) {
+		if (formData[key] === '' || formData[key] === null || formData[key] === undefined) {
+		    delete formData[key];
 		}
+	}
+	
+// 	delete formData['varNmList'];
+	
+	// 선택된 데이터 추가 (varListMap)
+	formData["varListMap"] = dataList;
+	console.log('formData : ', formData);
+	
+	if(confirm("알림톡을 발송하시겠습니까?")){
+
+        
+        
+    $.ajax({
+        type: "POST",
+        url: "/web/mjon/kakao/alimtalk/kakaoAlimTalkMsgSendAjax_advc.do",
+        data: JSON.stringify(formData),
+        contentType: 'application/json',
+        dataType: 'json',
+        success: function (data) {
+				console.log('data : ', data);
+// 				if(data == 'success'){
+					/* if("loginFail" == returnData.result){
+						
+						alert(returnData.message);
+						return false;
+						
+					}else  if('fail' == returnData.result){
+						
+						alert(returnData.message);
+						return false;
+						
+					}else if('authFail' == returnData.result){
+						
+						alert(returnData.message);
+						location.reload();
+						
+					} else if(status == 'success'){
+						
+						var kakaoSendCnt = returnData.resultSts;
+						
+						$('.pop_msg_success').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'});
+						
+						//예약발송 건의 경우 결과 팝업 문구 변경
+						if(reserYn == 'Y'){
+							$('.pop_msg_success .msg_text').html("예약 성공 : <strong>"+ kakaoSendCnt + "</strong>건의<br>알림톡이 예약 되었습니다.");
+						}else{
+							$('.pop_msg_success .msg_text').html("발송 성공 : <strong>"+ kakaoSendCnt + "</strong>건의<br>알림톡이 발송 되었습니다.");
+						}
+						
+						$('.mask').addClass('on');
+					} */
+// 				}
+			}
+			,beforeSend : function(xmlHttpRequest) {
+				//로딩창 show
+				$('.loading_layer').addClass('active');
+			}
+			,complete : function(xhr, textStatus) {
+				//로딩창 hide
+				$('.loading_layer').removeClass('active');
+			}
+			,error: function (e) {
+				console.log("ERROR : ", e);
+				alert("카카오 알림톡 전송에 실패하였습니다.");
+			}
+		}); 
 	}
 }
 
@@ -739,7 +724,7 @@
  *	치환문자 있는 수신자 목록 파씽
  */
 function fn_transCallToListParsing(){
-	var callToList = [];
+/* 	var callToList = [];
 	// excel body
 	$('.excelBody').each(function(indexBody, itemBody){
 		$(itemBody).find('.list_table_name').each(function(indexRow, itemRow){
@@ -750,7 +735,31 @@
 		});
 	});
 	$('#bizForm #callToList').val(callToList);
+ */
 
+	var dataList = [];
+	
+	var headers = [];
+	$('#excelHead .list_table_name').each(function() {
+	  headers.push($(this).text().trim());
+	});
+	
+	$('.excelBody').each(function() {
+		var row = {};
+		$(this).find('.list_table_name').each(function(index) {
+			var key = headers[index];
+			var value = $(this).text().trim();
+			if (index === 0) {
+			    row["callToList"] = value; // 수신번호는 별도로 처리
+			} else {
+			    row[key] = value; // 
+			}
+		});
+		console.log(row)
+		dataList.push(row);
+	});
+
+	return dataList;
 }
 
 /*
@@ -758,13 +767,25 @@
  */
 function fn_callToListParsing(){
 
-	var callToList = [];
+    var dataList = [];
+	/* var callToList = [];
 	// excel body
 	$('.phoneArea').each(function(index, item){
 			callToList.push($(item).text().replaceAll('\\t', ''));
 	});
 	
-	$('#bizForm #callToList').val(callToList);
+	$('#bizForm #callToList').val(callToList); */
+	
+	$('.phoneArea').each(function(index, item){
+        var row = {};
+        var value = $(item).text().replaceAll('\\t', '')
+        row["callToList"] = value; // 수신번호는 별도로 처리
+        dataList.push(row);
+    });
+	
+    return dataList;
+
+	
 
 }
 
@@ -777,9 +798,8 @@
 	// title 배열
 	var varHead = [];
 	// 값 배열
-	var varVal = [];
+// 	var varVal = [];
 	
-	var inputTag = '<input type="hidden" class="varValList" name="varValList[$INDEX$]" value="$VAL$">';
 	
 	// excel title
 	$('#excelHead').find('div').each(function(index, item){
@@ -803,7 +823,7 @@
 		$("#bizForm").append(inputTag.replace('$VAL$',varValTemp ).replace('$INDEX$',index ));
 	}); */
 	
-	$('.excelBody').each(function(index, item){
+/* 	$('.excelBody').each(function(index, item){
 		
 		var valLeng = $('#excelHead').find('.list_table_name').length-1;
 		varValTemp = '';
@@ -821,7 +841,7 @@
 		console.log('varValTemp : ',varValTemp);
 		varVal.push(varValTemp);
 	});
-	$('#bizForm #varValList').val(varVal);
+	$('#bizForm #varValList').val(varVal); */
 }
 
 
@@ -1136,8 +1156,8 @@
 		<input type="hidden" id="divideTime" name="divideTime" value="">				<!--전송일자-->
 		
 		<input type="hidden" id="callFrom" name="callFrom" value="">					<!--완  보내는사람 -->	
-		<input type="hidden" id="callToList" name="callToList" value="">				<!--완  받는사람 리스트-->
-		<input type="hidden" id="varNmList" name="varNmList" value="">					<!--완  변수 이름  리스트-->
+<!-- 		<input type="hidden" id="callToList" name="callToList" value="">				완  받는사람 리스트 -->
+<!-- 		<input type="hidden" id="varNmList" name="varNmList" value="">					완  변수 이름  리스트 -->
 		<input type="hidden" id="varValList" name="varValList" value="">				<!--완  변수 리스트-->
 		
 		<input type="hidden" id="atSmishingYn" name="atSmishingYn" value="${atSmishingYn}">		<!--알림톡 스미싱 여부-->
 
src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView_advcbackup_20250310.jsp (added)
+++ src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView_advcbackup_20250310.jsp
@@ -0,0 +1,1773 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<%@ page import="itn.com.cmm.LoginVO" %>
+
+<!-- <script src="/publish/js/content.js"></script> -->
+<!-- 주소록관련 js -->
+<script type="text/javascript" defer src="<c:out value='/js/kakao/at/init.js' />"></script>
+<script type="text/javascript" src="<c:out value='/js/kakao/at/tabulator.js' />"></script>
+<script type="text/javascript" src="<c:out value='/js/kakao/at/addr.js' />"></script>
+<script type="text/javascript" src="<c:out value='/js/kakao/at/alimtalkExcel.js' />"></script>
+<script type="text/javascript" src="<c:out value='/js/kakao/at/priceClclt.js' />"></script>
+<script type="text/javascript" src="<c:out value='/js/common/popup.js' />"></script>
+<script type="text/javascript">
+var loginVO = '${loginVO}';
+
+// 체크박스 동적 바인딩
+$(document).on('click','.wrap01C', function(){
+	var total = $(".wrap01C").length;
+	var checked = $(".wrap01C:checked").length;
+	if(total != checked) $("#select_all").prop("checked", false);
+	else $("#select_all").prop("checked", true);
+});
+
+$(document).ready(function(){
+
+	//채널 ID change function
+	$("#selectKakaoProfileList").on("change", function(){
+		
+		if(usrDeptChk()){
+			
+			$("#selectTemplateList option").remove();
+			selectTemplateList();
+			
+		}else {
+			
+			$("#selectKakaoProfileList option:eq(0)").prop("selected", true);
+			
+		}
+		
+	});
+	
+	//템플릿 change function
+	$("#selectTemplateList").on("change", function(){
+		selectTemplateInfo($(this).val());
+		fn_viewDataInit02();
+		priceInit(); // 발송금액 라인 text / 금액 초기화
+	});
+	
+	$("#fileClick").click(function(){
+		if($('#selectTemplateList').val() == '')
+		{
+			alert('템플릿을 선택 후 진행해 주세요.');
+			return false;
+		}
+		if($("#tpButtonTypeDs").val() == "DS"){
+			alert("템플릿 내용에 배송조회 버튼이 포함되어 있습니다. \n운송장 번호는 숫자만 등록해주세요")
+		}
+		$('#excelFile').val('');
+		$("#excelFile").click();
+	});
+
+	//즉시 발송 라디오 버튼 선택시 숨김처리
+	$("#reserYnN").on('click', function(){
+		$('.rev_selected').hide();
+		$('.send_rev .send_content').css('padding-bottom','108px');
+		$('.send_btn .btnType:first-child').html('발송하기');
+		$('#bizForm #reserveYn').val($(this).val());
+	});
+
+	//예약 발송 라디오 버튼 선택시 숨김 해제처리
+	$("#reserYnY").on('click', function(){
+		$('.rev_selected').show();
+		$('.send_rev .send_content').css('padding-bottom','0');
+		$('.send_btn .btnType:first-child').html('예약하기');
+		$('#bizForm #reserveYn').val($(this).val());
+	});
+
+	//전체선색 버튼 이벤트
+	$("#select_all").on('click', function(){
+		if($("#select_all").is(":checked")) $(".wrap01C").prop("checked", true);
+		else $(".wrap01C").prop("checked", false);
+		
+	});
+	
+	//선택삭제 버튼 클릭 이벤트
+	$("#select_del").on('click', function(){
+		
+		if($('.wrap01C:checkbox:checked').length < 1)
+		{
+			alert("삭제할 연락처를 선택해주세요.!!");
+			return false;
+		}
+		
+		$('.wrap01C').each(function(index, item){
+			if($(item).is(':checked'))
+				$(item).parent().parent().remove();
+		});
+		updateTotCnt();
+	});
+
+	//선택삭제 버튼 클릭 이벤트
+ 	$("#all_del").on('click', function(){
+		
+		if(!confirm("받는사람 목록을 모두 삭제하시겠습니까?"))
+			return false;
+		
+		$('#wrap01_body .list_body').remove();
+
+		$('#rowTotCnt').text(0);
+		$('#rowDupCnt').text(0);
+	});
+
+	/* 
+	* 오류 검사
+	*/
+	$('#check_validity').click(function(){
+		var regExp_ctn = /^(01[016789]{1}|02|0[3-9]{1}[0-9]{1})([0-9]{3,4})([0-9]{4})$/;
+		// 치환문자 있는 데이터
+		if($('#bizForm #txtReplYn').val() === 'N'){
+
+			if($('.phoneArea').length < 1){
+				alert("등록된 연락처가 없습니다.")
+				return false;
+			}
+
+			$('.phoneArea').each(function(index, item){
+				var phoneVal = $(item).text().trim();
+				if(phoneVal.length==11 || phoneVal.length==10) 
+				{
+					if(!regExp_ctn.test(phoneVal))
+					{
+						alert(phoneVal+"는 유효하지 않은 전화번호 입니다.");
+						return false;
+					}
+				}
+				else
+				{
+					alert("유효하지 않은 전화번호 입니다.");
+					return false;
+				}
+			});
+			alert("오류 데이터가 없습니다.");
+		}
+	});
+	
+	/**
+	* 템플릿 재선택 버튼 function
+	*/
+	$('#reSelectBtn').click(function(){
+		var senderKey = $('#selectKakaoProfileList option:selected').val();
+
+		if(!senderKey)
+		{
+			alert("채널ID를 선택하고 다시 시도해 주세요.");
+			return false;
+		}
+			
+			
+		var url = "";
+		var windowTargetName = "KakaoAlimtalkTemplateListPopupAjax";
+// 		var features = "width=930, height=860, top=100, left=100, fullscreen=no, menubar=no, status=no, toolbar=no, titlebar=yes, location=no, scrollbars=yes";
+		// 2.POST로 데이터 전달
+		document.templateListPopup.senderKey.value=$('#selectKakaoProfileList option:selected').val();
+		document.templateListPopup.yellowId.value=$('#selectKakaoProfileList option:selected').text();
+		document.templateListPopup.target=windowTargetName;
+		showPopup2('',windowTargetName ,'930','860');
+		document.templateListPopup.submit();
+	
+	});
+	
+	
+
+	$("#send_fail_check").change(function(){
+		if($("#send_fail_check").is(":checked")){
+
+			
+			if(loginVO == "" || loginVO == null){
+				alert("로그인 후 사용 가능한 기능입니다.");
+				location.href="<c:url value='/web/user/login/login.do'/>";
+				return false;
+				
+				$("#send_fail_check").prop("checked", false);
+			}
+			
+			if($('#callFromList').val() === ''){
+				
+				if(confirm('대체문자 전송을 위한 발신번호가 등록되지 않았습니다. \n대체문자 발신번호를 지금 등록하시겠습니까?')){
+					window.location="<c:out value='/web/user/sendNumberManage.do' />";
+				}
+				$("#send_fail_check").prop("checked", false);
+				
+			}else if($('#selectTemplateList').val() == '')
+			{
+				alert('템플릿을 선택 후 진행해 주세요.');
+				$("#send_fail_check").prop("checked", false);
+				return false;
+			}else{
+				// 에러버튼 체크 초기화
+				fn_insertErrorYN('N');
+				
+				$('#smsTxtArea').val('');
+// 				// 미리보기 텍스트를 가져와 줄바꿈 처리 후 대체문자 내용으로 입력
+				var template_text = $('.template_text').html().trim();
+				template_text = XSSChange(template_text);
+				$('#smsTxtArea').val(template_text);
+
+// 				//문자 내용 입력시 바이트수 계산하기
+				
+				$(".replace_send_wrap").slideDown(400);
+				thisFnByteString($('#smsTxtArea').val());
+			}
+		}else{
+			$(".replace_send_wrap").slideUp(400);
+			// 초기화 버튼 클릭
+			$('#failCheckInit').click();
+			$('.send_top .send_right .phone').css({'top': '0','transition': 'top .4s linear'});
+		}
+
+		// 금액 계산 fn 호출
+		fn_priceClclt();
+	});
+	
+	// 대체문자 내용 수정
+	$('#smsTxtArea').keyup(function(){
+		// 금액 계산 fn 호출
+		fn_priceClclt();
+		// 문자 바이트수 체크
+		thisFnByteString($('#smsTxtArea').val());
+		// 에러버튼 체크 초기화
+		fn_insertErrorYN('N');
+		
+	});
+});
+function sendFailCheckInit(){
+	
+	$("#send_fail_check").prop("checked", false);
+	
+}
+
+function fnTemplateReg(){
+	if(loginVO == "" || loginVO == null){
+		alert("신규 템플릿 등록 서비스는 로그인 후 이용 가능합니다.");
+		location.href="<c:url value='/web/user/login/login.do'/>";
+		return false;
+	}
+	if(usrDeptChk()){
+		
+		if(confirm('신규 템플릿 등록 화면으로 이동하시겠습니까?')){
+			location.href="<c:url value='/web/mjon/kakao/template/selectKaKaoTemplateList.do'/>";
+		}
+	}
+	
+}
+
+/*
+ * 탬플릿 재선택 팝업에서 실행하는 function
+ */
+function call_templateChange(templateId){
+	
+	$('#selectTemplateList').val(templateId).prop('selected', true);
+	selectTemplateInfo(templateId);
+// 	$('#selectTemplateList').val('bizp_2023021711142018819557746').prop('selected', true);
+}
+
+
+/**
+ * 먼저 불러온 DATA가 있으면 삭제
+ * !! 화면에 보이는 data만 삭제 !!
+ * 치환 데이터 
+ */
+function fn_viewDataInit01(){
+
+	// excel Data (치환 문자 table) 비우기
+	$('#excelHead').empty();
+	$('.excelBody').remove();
+	$('#excelNm01').val('');
+	// 치환문자 없을 경우
+// 	$('#wrap01_body .list_body').remove();
+}
+
+/**
+ * 먼저 불러온 DATA가 있으면 삭제
+ * !! 화면에 보이는 data만 삭제 !!
+ * 총건수, 중복건수 데이터 0으로 초기화
+ * 엑셀 불러오기 데이터 
+ */
+function fn_viewDataInit02(){
+	$('.excelBody').remove();
+	$('#excelHead').empty();
+	$('#rowTotCnt').text("0");
+	$('#rowDupCnt').text("0");
+}
+
+/*
+ *변수 다운로드 excel show function
+ */
+function variableWrapShow(){
+	$(".receiver_wrap02").attr("style","display: block !important;");
+	$(".receiver_wrap01").attr("style","display: none !important;");
+	$(".variable_wrap").show();
+	$('#bizForm #txtReplYn').val('Y');
+	
+}
+
+/*
+ * 변수 다운로드 excel hide function
+ */
+function variableWrapHide(){
+	$(".receiver_wrap01").attr("style","display: block !important;");
+	$(".receiver_wrap02").attr("style","display: none !important;");
+	$(".variable_wrap").hide();
+	$('#bizForm #txtReplYn').val('N');
+	
+}
+
+
+/*
+ * 등록된 발신 탬플릿 목록 조회 function
+ */
+function selectTemplateList(){
+	var selectAgentCode = $("select[name='selectKakaoProfileList']").val();
+	$.ajax({
+		type: "POST"
+		, url: "<c:out value ='/web/mjon/kakao/alimtalk/selectKakaoApiTemplateAjax.do' />"
+		, data:{ "senderKey":selectAgentCode, "pageType":"notityTalk"}
+		, dataType:'json'
+		, cache: false
+		, async: false
+		, timeout: 600000
+		, success: function (returnData, status) {
+			if(status == 'success'){
+				
+				$("#selectTemplateList option").remove();
+				$("#selectTemplateList").append("<option value=''>알림톡 템플릿 선택</option>");
+				
+				var list =  returnData.kakaoTemplateList;
+				for(var i=0; i < list.templatList.length; i++){
+					$("#selectTemplateList").append("<option value='"+list.templatList[i].templateCode+"'>"+list.templatList[i].templateName+"</option>");
+				}
+				
+			} else if(status== 'fail'){
+				alert(returnData.message);
+			}
+		}
+		,error: function (e) {
+			console.log("ERROR : ", e);
+			alert("관리자에게 문의해 주세요");
+		}
+	});
+}
+
+/*
+ * 템플릿 선택하여 정보 가져오는 function
+ */
+function selectTemplateInfo(id){
+	
+	var selectAgentCode = $("select[name='selectKakaoProfileList']").val();
+	
+	$("#alimtalkTemplate").empty();
+	
+	// 우측 본문내용 만들기
+	$("#alimtalkTemplate").load("/web/mjon/kakao/template/selectKakaoApiTemplateDataViewLoadAjax.do"
+	, {
+		"senderKey":selectAgentCode
+		, "templateCode" : id
+	},function(){
+		
+
+		// =================== 대체문자 숨김 / html 초기화
+		$(".replace_send_wrap").slideUp(400);
+		// 초기화 버튼 클릭
+		$('#failCheckInit').click();
+		$('.send_top .send_right .phone').css({'top': '0','transition': 'top .4s linear'});
+		$("#send_fail_check").prop("checked", false);
+		// //=================== 대체문자 숨김 / html 초기화
+		
+		
+		// 미리보기에 채널ID 노출 
+		$('#prev_p_top').text($('#selectKakaoProfileList option:selected').text());
+		
+		
+		var tpTemplateContent = $('#tpTemplateContent').val();
+		$("#senderKeyInfo").val(selectAgentCode);
+		$("#templateCodeInfo").val($('#tpTemplateCode').val());
+			
+		//엑셀 샘플 정보 - 내용만 변수처리하기
+		$("#excelTemplateContent").val(tpTemplateContent);
+		$("#excelTemplateSubtitle").val($('#tpTemplateSubtitle').val());
+		$("#excelTemplateTitle").val($('#tpTemplateTitle').val());
+		
+		if(($('#tpTemplateEmphasizeType').val() != "NONE") || $('#tpBottonListSize').val() != "0"){
+			$('#bizForm #bizJsonYn').val('Y');
+		}else{
+			$('#bizForm #bizJsonYn').val('N');
+		}
+		
+		
+		if($('#tpTemplateEmphasizeType').val() == "TEXT"){
+			$("#templateEmphasizeType").val($('#tpTemplateEmphasizeType').val());
+			$("#templateTitle").val($('#tpTemplateTitle').val());
+			$("#templateSubtitle").val($('#tpTemplateSubtitle').val());
+		}
+		
+		$("#bizForm  #templateContent").val(tpTemplateContent);
+		templateChange();
+	
+	});
+}
+
+/*
+ * 알림톡 변수가 있는지 체크해서 변수 다운로드 excel show / hide 하는 function
+ */
+function templateChange(){
+	var varList = $("#excelTemplateContent").val().match(/#\{([^}]+)\}/g);
+	if(varList == null)
+		variableWrapHide();
+	else
+		variableWrapShow();
+	
+}
+//엑셀 업로드 양식 다운로드 받기
+function excelDownload(){
+	
+	if(loginVO == "" || loginVO == null){
+		alert("변수설정 엑셀파일 다운로드는 서비스는 로그인 후 이용 가능합니다.");
+		location.href="<c:url value='/web/user/login/login.do'/>";
+		return false;
+	}
+	
+	var profile = $("#selectKakaoProfileList").val();
+	var template = $("#selectTemplateList").val();
+	
+	if(profile == ''){
+		
+		alert("채널ID를 선택해주세요.");
+		return false;
+		
+	}
+	
+	if(template == ''){
+		
+		alert("알림톡 템플릿을 선택해주세요.");
+		return false;
+		
+	}
+	
+	//합친 내용에서 변수 문자열 뽑기 - #과{}미포함
+	var fullVarList = $("#excelTemplateContent").val().match(/(?<=\#\{)(.*?)(?=\})/g);
+	$('#excelForm #varNmList').val(fullVarList);
+	$('#excelForm').submit();
+	
+}
+
+function checkConf() {
+	var confCheck = false;
+	
+	$.ajax({
+		type: "POST",
+		url: "/web/mjon/conf/selectMjonMsgUseConfAjax.do",
+		data: {},
+		dataType:'json',
+		async: false,
+		success: function (returnData, status) {
+			if(returnData.result == "fail") {
+				console.log(returnData.message);
+			}else if(returnData.result == "success"){
+				confCheck = true;
+			}
+		}
+		,error: function (e) {console.log("ERROR : ", e); }
+	});	
+	
+	return confCheck;
+}
+
+/*
+ *	등록된 발신 탬플릿 카카오톡 전송 
+ */
+function sendTemplateInfo(){
+
+	if(!checkConf()){	//문자온 conf-check
+		alert("현재 알림톡 발송하기 기능 점검 중입니다.\n\n1분 후 다시 시도해주세요.");
+		return false;
+	}
+	
+	if(loginVO == "" || loginVO == null){
+		alert("카카오톡 발송 서비스는 로그인 후 이용 가능합니다.");
+		location.href="<c:url value='/web/user/login/login.do'/>";
+		return false;
+	}
+	
+	if(!usrDeptChk()){
+		return false;
+	}
+	
+	//채널ID / 템플릿 선택
+	if(!$('#selectKakaoProfileList').val())
+	{
+		alert('채널ID를 선택 후 발송해 주세요');
+		return false;
+	}
+	
+	if(!$('#selectTemplateList').val() )
+	{
+		alert('템플릿을 선택 후 발송해 주세요');
+		return false;
+	}
+	
+	//수신자 목록 체크
+	if($('.phoneArea').length < 1)
+	{
+		alert('받는 사람 입력 후 발송해 주세요');
+		return false;
+	}
+	
+	//수신자 목록 체크
+	if($('.phoneArea').length > 500)
+	{
+		alert("최대 발송 건수는 500건 입니다.");
+		return false;
+	}
+	
+
+	if($('#errorChk').val() === 'N' 
+			&& $("#send_fail_check").is(":checked")
+			&& $('#txtReplYn').val() === 'Y'
+	)
+	{
+		alert('대체문자 전송을 원하시면 오류검사 버튼을 확인해 주세요.');
+		return false;
+	}
+	
+	// 금액 확인
+	// 사용자 금액
+	var userMoney = $('#oriUserMoney').val();
+	// 발송 금액
+	var totalPriceTxt = $('#totalPriceTxt').text();
+	// 금액 확인
+	var resutlPrice = parseFloat(userMoney)-parseFloat(totalPriceTxt);
+
+	// 음수면 -1 값
+	if(Math.sign(resutlPrice) < 0)
+	{
+		alert("발송에 필요한 회원님의 보유 잔액이 부족 합니다.");
+		return false;
+	}
+	
+	// 초기화
+	$('.varValList').remove();
+	$('#bizForm #varNmList').val('');
+
+
+	// 대체문자 전송 확인
+	if($('#send_fail_check').is(':checked')){
+		$('#bizForm #subMsgSendYn').val("Y");
+		$('#bizForm #subMsgTxt').val($("#smsTxtArea").val());
+		
+		var subMsgTxt = $("#smsTxtArea").val().match(/#\{([^}]+)\}/g);
+		if(subMsgTxt == null){
+			$('#bizForm #subMsgTxtReplYn').val("N");
+		}else{
+			$('#bizForm #subMsgTxtReplYn').val("Y");
+		}
+	}else{
+		$('#bizForm #subMsgSendYn').val("N");
+	}
+	
+	// 예약문자 및 분할전송 확인
+	var reserYn = $("input[name=reserYn]:checked").val(); // 예약 발송 여부 확인
+	$('#bizForm #reserveYn').val(reserYn);
+	if(reserYn == 'Y'){
+		
+		var date = $(".resDate").val();//form.msgResDate.value;
+		var hour = $("select[name='msgResHour']").val();
+		var min = $("select[name='msgResMin']").val();
+		
+		if(date == ""){
+			alert("예약전송 날짜를 선택해 주세요.");
+			return false;
+			
+		}else{
+			
+			var now = new Date();
+			var reqDate = date + " " + hour + ":" + min + ":00";
+			var gapDate = getGapDayTime(date, hour, min);
+			
+			if(gapDate < 0){ // 음수이면 이전날짜, 크면 이후 날짜.
+				alert("예약 날짜는 현재 시간 이후의 날짜 및 시간을 선택해 주세요.");
+				return false;
+			}else{
+				$('#bizForm #reqDate').val(reqDate);
+			}
+		}
+		
+		var divideChk =  "";
+		if($('#inputDivideChk').is(':checked')){
+			divideChk = "Y";
+		}else{
+			divideChk = "N"
+		}
+		
+		//var divideCnt = $("select[name='frmDivideCnt']").val();
+		var divideCnt = $('#frmDivideCnt').val();
+		var divideTime = $("select[name='divideTime']").val();
+		
+		$('#bizForm #divideChk').val(divideChk);
+		$('#bizForm #divideCnt').val(divideCnt);
+		$('#bizForm #divideTime').val(divideTime);
+		
+	}else{
+		$('#bizForm #reqDate').val("");
+	}
+	
+	// 치환문자 있는 데이터 파씽
+	if($('#bizForm #txtReplYn').val() === 'Y'){
+		fn_excelDataTransParsing();
+		// 치환문자 있는 수신자 리스트 
+		fn_transCallToListParsing();
+	}else{
+		// 치환문자 없는 수신자 리스트 
+		fn_callToListParsing();
+	}
+
+	$('#bizForm #senderKey').val($('#selectKakaoProfileList').val());
+	$('#bizForm #templateCode').val($('#selectTemplateList').val());
+	
+	// 발신번호
+	$('#bizForm #callFrom').val(removeDash($('#callFromList option:selected').val()));
+	
+	if(confirm("알림톡을 발송하시겠습니까?")){
+		var spamChk = true;
+		//2023.09.06 알림톡 스팸체크 기능 제거요청으로 인한 주석처리
+		/*var spamChk = false;
+		var spmData = new FormData(document.bizForm);
+		$.ajax({
+			type: "POST"
+			, url: "/web/mjon/alimtalk/selectSpamKakaoAlimtalkMsgChkAjax.do"
+			, data: spmData
+			, dataType:'json'
+			, async: false
+			, processData: false
+			, contentType: false
+			, cache: false
+			, success: function (returnData, status) {
+				if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나
+					
+					if("fail" == returnData.result){
+						alert(returnData.message);
+						return false;
+					}else if("loginFail" == returnData.result){
+						alert(returnData.message);
+						return false;
+					}else if("spams" == returnData.result){
+						alert("전송 내용에  스팸문구가 포함되어 있습니다.")
+						return false;
+					}else{
+						spamChk = true;
+						return false;
+					}
+					
+				} else if(status== 'fail'){
+					alert(returnData.message);
+					return false;
+				}
+			}
+			, error: function (e) {
+				alert("문자 발송에 실패하였습니다.");
+				console.log("ERROR : ", e);
+				return false;
+			}
+		}); */
+		
+		if(spamChk){
+			var data = new FormData(document.bizForm);
+			$.ajax({
+				type: "POST"
+				, url: "/web/mjon/kakao/alimtalk/kakaoAlimTalkMsgSendAjax.do"
+//				, url: "/web/mjon/kakao/alimtalk/kakaoAlimTalkMsgSendAjax_advc.do"
+				, data: data
+				, dataType: 'json'
+				, async: true
+				, processData: false
+				, contentType: false
+				, cache: false
+				, success: function (returnData, status) {
+					console.log('returnData : ', returnData);
+					if(status == 'success'){
+						/* if("loginFail" == returnData.result){
+							
+							alert(returnData.message);
+							return false;
+							
+						}else  if('fail' == returnData.result){
+							
+							alert(returnData.message);
+							return false;
+							
+						}else if('authFail' == returnData.result){
+							
+							alert(returnData.message);
+							location.reload();
+							
+						} else if(status == 'success'){
+							
+							var kakaoSendCnt = returnData.resultSts;
+							
+							$('.pop_msg_success').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'});
+							
+							//예약발송 건의 경우 결과 팝업 문구 변경
+							if(reserYn == 'Y'){
+								$('.pop_msg_success .msg_text').html("예약 성공 : <strong>"+ kakaoSendCnt + "</strong>건의<br>알림톡이 예약 되었습니다.");
+							}else{
+								$('.pop_msg_success .msg_text').html("발송 성공 : <strong>"+ kakaoSendCnt + "</strong>건의<br>알림톡이 발송 되었습니다.");
+							}
+							
+							$('.mask').addClass('on');
+						} */
+					}
+				}
+				,beforeSend : function(xmlHttpRequest) {
+					//로딩창 show
+					$('.loading_layer').addClass('active');
+				}
+				,complete : function(xhr, textStatus) {
+					//로딩창 hide
+					$('.loading_layer').removeClass('active');
+				}
+				,error: function (e) {
+					console.log("ERROR : ", e);
+					alert("카카오 알림톡 전송에 실패하였습니다.");
+				}
+			}); 
+		}
+	}
+}
+
+/*
+ *	치환문자 있는 수신자 목록 파씽
+ */
+function fn_transCallToListParsing(){
+	var callToList = [];
+	// excel body
+	$('.excelBody').each(function(indexBody, itemBody){
+		$(itemBody).find('.list_table_name').each(function(indexRow, itemRow){
+			if(indexRow == 0)
+			{
+				callToList.push($(itemRow).text().replaceAll('\\t', ''));
+			}
+		});
+	});
+	$('#bizForm #callToList').val(callToList);
+
+}
+
+/*
+ *	치환문자 없는 수신자 목록 파씽
+ */
+function fn_callToListParsing(){
+
+	var callToList = [];
+	// excel body
+	$('.phoneArea').each(function(index, item){
+			callToList.push($(item).text().replaceAll('\\t', ''));
+	});
+	
+	$('#bizForm #callToList').val(callToList);
+
+}
+
+/*
+ *	받는사람 excel data 파씽
+ */
+function fn_excelDataTransParsing(){
+
+	
+	// title 배열
+	var varHead = [];
+	// 값 배열
+	var varVal = [];
+	
+	var inputTag = '<input type="hidden" class="varValList" name="varValList[$INDEX$]" value="$VAL$">';
+	
+	// excel title
+	$('#excelHead').find('div').each(function(index, item){
+		if(index != 0)
+			varHead.push($(item).text().replaceAll('\\t', ''));
+	});
+	$('#bizForm #varNmList').val(varHead);
+	
+	// excel body
+/* 	$('.excelBody').each(function(index, item){
+		varValTemp = [];
+		$(item).find('.list_table_name').each(function(index, item){
+			if(index != 0){
+				if(index == 1){
+					varValTemp = $(item).text().replaceAll('\\t', '');
+				}else
+					varValTemp += ","+$(item).text().replaceAll('\\t', '');
+			}
+		});
+		
+		$("#bizForm").append(inputTag.replace('$VAL$',varValTemp ).replace('$INDEX$',index ));
+	}); */
+	
+	$('.excelBody').each(function(index, item){
+		
+		var valLeng = $('#excelHead').find('.list_table_name').length-1;
+		varValTemp = '';
+		
+		$(item).find('.list_table_name').each(function(index, item){
+			if(index != 0)
+			{
+				var itemText = $(item).text().replaceAll('\\t', '');
+				if(index !== 1)
+					varValTemp += '§'+itemText.replaceAll(',', 'Ï');
+				else
+					varValTemp += itemText.replaceAll(',', 'Ï');
+			}
+		});
+		console.log('varValTemp : ',varValTemp);
+		varVal.push(varValTemp);
+	});
+	$('#bizForm #varValList').val(varVal);
+}
+
+
+
+//주소록 불러오기 버튼 클릭시
+$('.popupAddr').click(function(){
+	
+	if(loginVO == "" || loginVO == null){
+		alert("주소록 불러오기 서비스는 로그인 후 이용 가능합니다.");
+		location.href="<c:url value='/web/user/login/login.do'/>";
+		return false;
+	}
+	
+	$("#addrGroupLoad").load("/web/mjon/msgdata/selectAddrGroupListAjax.do", "" ,function(response, status, xhr){
+		//리스트 스크롤 처리해주기
+		$(".adr_pop_list").mCustomScrollbar({
+			axis: 'y',
+			scrollbarPosition: "outside",
+			theme: "dark",
+			autoHideScrollbar: false
+		});
+	});
+	
+});
+
+
+//알림톡 상세보기 화면 호출
+function fnTemplateDetail(templateCode){
+	var form = document.templateForm;
+	var selectAgentCode = $("select[name='selectKakaoProfileList']").val();				// 선택 채널ID
+	
+	form.senderKey.value = selectAgentCode;
+	form.templateCode.value = templateCode;
+	form.target='_blank';
+	form.action="/web/mjon/kakao/template/requestKakaoApiTemplateDetail.do";
+	form.submit();
+	
+}
+
+
+//문자 바이트수 계산하기 함수
+function thisFnByteString(contents){
+	var totalByte = 0; 
+	//var content = contents;
+	var adverYn = $("input[name='send_adYn']:checked").val();
+	var adTxtLeng = 0;
+	var denyTxtLeng = 0;
+
+	$('#msgLeng').html("");
+	$('#limitLeng').html("");
+	var conLeng = conByteLeng(contents); // 내용 문자 입력 바이트 수 계산하기
+	
+		
+	$('#msgLeng').text(conLeng);
+	
+	//문자 길이 변수에 저장해주기
+	$('#smsLen').val(conLeng);
+	
+	
+	if(conLeng > 90){
+		
+		$('#msgLeng').html(conLeng + " / ");
+		$('#limitLeng').html("2000");
+		$('.msg_com').html("장문");
+		$('#msgType').val("6"); // 메세지 타입 설정
+		
+		$('.msg_com').removeClass("msg_short"); //단문 클래스 삭제하고
+		$('.put_left').removeClass("short"); //내용 입력 박스 클래스 삭제
+		$('.msg_com').addClass("msg_long"); // 장문 클래스 삽입
+// 		$('.put_left').addClass("long");  // 내용 입력 박스에 클래스 삽입
+// 		$('.msg_title').addClass('active');
+		//document.getElementById("mmsSubject").disabled = false;
+		
+	}else{
+		
+		$('#msgLeng').html(conLeng + " / ");
+		$('#limitLeng').html("90");
+		$('.msg_com').html("단문");
+		$('#msgType').val("4"); // 메세지 타입 설정
+		$('.msg_com').removeClass("msg_long"); //단문 클래스 삭제하고
+		$('.put_left').removeClass("long"); //내용 입력 박스 클래스 삭제
+		$('.msg_com').addClass("msg_short"); // 장문 클래스 삽입
+// 		$('.put_left').addClass("short");  // 내용 입력 박스에 클래스 삽입
+// 		$('.msg_title, .title_wrap .textbox').removeClass('active');
+		
+	}
+		
+	//수신목록 전체 데이터 갯수 구하기
+	updateTotCnt(totRows);
+}
+
+/**
+ * @description 대체문자 오류체크 funciton
+ */
+function fn_errorChk(){
+
+	// 대체문자가 없을 시 return false;
+	if($('#txtReplYn').val() === 'N')
+	{
+		alert('오류가 없습니다.');
+		return false;
+	}
+
+	// 치환 부분 변수명만 추출 = 배열
+	var varList = $("#excelTemplateContent").val().match(/#\{([^}]+)\}/g);
+	
+	var smsTxt = $('#smsTxtArea').val();
+	for(var i=0; i < varList.length; i++){
+		if(smsTxt.indexOf(varList[i]) < 0){
+			if(confirm(varList[i] + '값이 없습니다. 치환문자 없이 진행하시겠습니까?')){
+				fn_insertErrorYN('Y');
+			};
+			return false;
+		}
+		smsTxt = smsTxt.replace(varList[i], '');
+	};
+	alert('오류가 없습니다.');
+	fn_insertErrorYN('Y');
+}
+
+
+function fn_insertErrorYN(val){
+	$('#errorChk').val(val);
+}
+
+function msgResultLink(){
+	var reserYn = $("input[name=reserYn]:checked").val(); // 예약 발송 여부 확인
+	if(reserYn == 'Y'){
+		
+		location.href="/web/mjon/reservmsg/selectReservKaKaoView.do";
+		
+	}else{
+		location.href="/web/kakao/sent/selectKakaoSentView.do";
+	}
+}
+
+function msgSuccessClose(obj){
+	$(obj).closest('.pop_msg_success').attr('style','');
+	location.reload(true);
+	$('html').scrollTop(0);
+}
+
+function goToKakaoTestPopUp(){
+	
+	if(loginVO == "" || loginVO == null){
+		alert("테스트 발송 서비스는 로그인 후 이용 가능합니다.");
+		location.href="<c:url value='/web/user/login/login.do'/>";
+		return false;
+	}
+	
+	//기업회원 체크
+	if(!usrDeptChk()){
+		return false;
+	}
+	
+	var form = document.kakaoAtDataTestPopupForm;
+	var selectAgentCode = $("select[name='selectKakaoProfileList']").val();
+	var selectTemplateCode = $("select[name='selectTemplateList']").val();
+	var selectAgentTxt = $('#selectKakaoProfileList option:selected').text()
+	var txtRepYn =  $('#bizForm #txtReplYn').val();
+	var tpTemplateContent = $('#tpTemplateContent').val();
+	var jsonYn = $('#bizForm #bizJsonYn').val();
+	
+	if(selectAgentCode == '') {
+		alert("채널ID를 선택하고 다시 시도해 주세요.");
+		return false;
+	}
+	
+	if(selectTemplateCode == ''){
+		alert('템플릿을 선택 후 진행해 주세요.');
+		return false;
+	}
+
+	// 치환문자 있는 데이터 파씽
+	if($('#bizForm #txtReplYn').val() === 'Y'){
+		
+		//수신자 목록 체크
+		if($('.phoneArea').length < 1){
+			alert('받는 사람 입력 후 발송해 주세요');
+			return false;
+		}
+		
+		// title 배열
+		var varHead = [];
+		// 값 배열
+		var varVal = [];
+		
+		// excel title
+		$('#excelHead').find('div').each(function(index, item){
+			if(index != 0)
+				varHead.push($(item).text().replaceAll('\\t', ''));
+		});
+		form.varNmList.value = varHead;
+		
+		$('.excelBody').each(function(index, item){
+			varValTemp = '';
+			
+			if(index == 0){
+				$(item).find('.list_table_name').each(function(index, item){
+					if(index != 0)
+					{
+						if(index !== 1)
+							varValTemp += '§'+$(item).text().replaceAll('\\t', '');
+						else
+							varValTemp += $(item).text().replaceAll('\\t', '');
+					}
+				});
+				varVal.push(varValTemp);
+			}
+		});
+		form.varValList.value = varVal;
+	}
+	
+	form.senderKey.value = selectAgentCode;
+	form.templateCode.value = selectTemplateCode;
+	form.agentCodeTxt.value = selectAgentTxt;
+	form.txtReplYn.value = txtRepYn;
+	form.templateContent.value = tpTemplateContent;
+	form.bizJsonYn.value = jsonYn;
+	
+	form.method = "post"; 
+	window.open("about:blank", 'testSendPop', 'width=770, height=850, top=100, left=100, fullscreen=no, menubar=no, status=no, toolbar=no, titlebar=yes, location=no, scrollbars=1');
+	form.target = "testSendPop";
+	form.action = "/web/mjon/kakao/alimtalk/selectKakaoAlimtalkTemplateDataTestPopup.do";
+	form.submit();
+}
+
+function goToReservKaKaoView(){
+	location.href="/web/mjon/reservmsg/selectReservKaKaoView.do";
+}
+
+function goToSendKaKaoView(){
+	location.href="/web/kakao/sent/selectKakaoSentView.do";
+}
+function goToPayUserKaKaoView(){
+	location.href="/web/member/pay/PayUserWithKakaoList.do";
+}
+
+function checkNumber(event) {
+	var divideCnt = $('#frmDivideCnt').val();
+	if(!(event.key >= 0 && event.key <= 9)) {
+		return false;
+	}
+	
+	var totCnt = divideCnt + "" + event.key;
+	if(Number(totCnt) > 5000){
+		alert("분할전송 건수는 5,000건을 초과할 수 없습니다.");
+		$('#frmDivideCnt').val("20");
+		return false;
+	}
+  
+  return true;
+}
+
+</script>
+
+	<div class="loading_layer">
+		<div class="loading_container">
+			<div class="bar"></div>
+			<div class="text">Loading</div>
+		</div>
+	</div>
+	
+	<!-- 기업회원 이동 팝업 -->
+	<div class="tooltip-wrap cvt_member_popup_wrap">
+	    <div class="popup-com cvt_member_layer" tabindex="0" data-tooltip-con="cvt_member_layer" data-focus="cvt_member_layer" data-focus-prev="cvt_member_layer-close">
+	       <div class="popup_heading">
+	           <p>알림</p>
+	           <button type="button" class="tooltip-close" data-focus="cvt_member_layer-close"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
+	       </div>
+	       <div class="layer_in">
+	           <p>카카오톡 알림톡은 기업회원만 전송 가능합니다.<br>기업회원 전환 페이지로 이동하시겠습니까?</p>
+	           <div class="popup_btn_wrap2">
+	           	<button type="button" onclick="location.href='/web/user/membershipChange.do'">확인</button>
+	               	<button type="button" class="tooltip-close" data-focus="cvt_member_layer-close" data-focus-next="cvt_member_layer">취소</button>
+	            </div>
+	        </div>
+	    </div>
+	</div>
+	<button type="button" id="btnDeptPop" data-tooltip="cvt_member_layer" style="display: none;"></button>
+		
+
+	<!-- 템플릿 설정 디테일을 위한 FORM -->
+	<form id="templateForm" name="templateForm" method="post">
+		<input type="hidden" name="senderKey" value=""/>
+		<input type="hidden" name="templateCode" value=""/>
+		<input type="hidden" name="arrTemplateCode" value=""/>
+	</form>
+
+	<form id="bizForm" name="bizForm" method="post">
+		<input type="hidden" id="menuTopTab" name="menuTopTab" value="tabAlim">
+		<input type="hidden" id="senderKey" name="senderKey" value="">					<!-- 카카오 보내는 사람 Key -->
+		<input type="hidden" id="templateCode" name="templateCode" value="">			<!-- 카카오 전송 templat Code -->
+		
+		<input type="hidden" id="templateEmphasizeType" name="templateEmphasizeType" value="">		<!-- 카카오 전송 templateEmphasizeType 타입 -->
+		
+		<input type="hidden" id="templateContent" name="templateContent" value="">		<!-- 카카오 전송 templat내용 -->
+		<input type="hidden" id="templateTitle" name="templateTitle" value="">			<!-- 카카오 전송 templat 타이틀 -->
+		<input type="hidden" id="templateSubtitle" name="templateSubtitle" value="">	<!-- 카카오 전송 templat 서브 타이틀 -->
+		
+		<input type="hidden" id="subMsgTxtReplYn" name="subMsgTxtReplYn" value="">		<!-- 대체문자 전송내용에 변환문자가 있는지-->
+		<input type="hidden" id="subMsgSendYn" name="subMsgSendYn" value="">			<!-- 대체문자 전송여부 - 알림톡 전송 실패 시 문자 전송-->  
+		<input type="hidden" id="subMsgTxt" name="subMsgTxt" value="">					<!-- 대체문자 전송내용 -->
+		<input type="hidden" id="txtReplYn" name="txtReplYn" value="N">					<!-- 완 치환문자 여부 - --> 	
+		<input type="hidden" id="bizJsonYn" name="bizJsonYn" value="">					<!-- JSON 생성 여부 -->
+		
+		<input type="hidden" id="reserveYn" name="reserveYn" value="">					<!-- 예약문자 여부 - 예약 선택 여부 // 아래 하단 화면 노출 여부도 같이-->	
+		<input type="hidden" id="reqDate" name="reqDate" value="">						<!--전송일자-->
+		
+		<input type="hidden" id="divideChk" name="divideChk" value="">					<!--전송일자-->
+		<input type="hidden" id="divideCnt" name="divideCnt" value="">					<!--전송일자-->
+		<input type="hidden" id="divideTime" name="divideTime" value="">				<!--전송일자-->
+		
+		<input type="hidden" id="callFrom" name="callFrom" value="">					<!--완  보내는사람 -->	
+		<input type="hidden" id="callToList" name="callToList" value="">				<!--완  받는사람 리스트-->
+		<input type="hidden" id="varNmList" name="varNmList" value="">					<!--완  변수 이름  리스트-->
+		<input type="hidden" id="varValList" name="varValList" value="">				<!--완  변수 리스트-->
+		
+		<input type="hidden" id="atSmishingYn" name="atSmishingYn" value="${atSmishingYn}">		<!--알림톡 스미싱 여부-->
+	</form>
+
+	<form id="excelForm" name="excelForm" action="<c:url value='/web/mjon/alimtalk/kakaoApiNotityTalkSampleExcelDownload.do'/>">
+		<input type="hidden" id="excelTemplateContent" name="excelTemplateContent" value="">
+		<input type="hidden" id="excelTemplateSubtitle" name="excelTemplateSubtitle" value="">
+		<input type="hidden" id="excelTemplateTitle" name="excelTemplateTitle" value="">
+		<input type="hidden" id="varNmList" name="varNmList" value="">
+		<input type="hidden" id="varValList" name="varValList[]" value="">
+	</form>
+
+<%-- 	<form id="templateListPopup" name="templateListPopup" action="<c:url value='/web/mjon/kakao/template/selectKakaoAlimtalkTemplateListPopupAjax.do'/>" method="post"> --%>
+	<form id="templateListPopup" name="templateListPopup" action="<c:url value='/web/mjon/kakao/template/selectKakaoAlimtalkTemplateListPopupAjax.do'/>" method="post">
+		<input type="hidden" id="senderKey" name="senderKey" value="">
+		<input type="hidden" id="yellowId" name="yellowId" value="">
+		<input type="hidden" id="page" name="page" value="1">
+		<input type="hidden" id="formListType" name="formListType" value="thumbnail">
+		<input type="hidden" id="templateStatus" name="templateStatus" value="ACT"> <!-- 기본값 ACT:정상  -->
+	</form>
+	
+	<!-- 테스트 전송 FORM -->
+	<form id="kakaoAtDataTestPopupForm" name="kakaoAtDataTestPopupForm" method="post">
+		<input type="hidden" id="senderKey" name="senderKey" value="">					<!-- 카카오 보내는 사람 Key -->
+		<input type="hidden" id="templateCode" name="templateCode" value="">			<!-- 카카오 전송 templat Code -->
+		<input type="hidden" id="templateContent" name="templateContent" value="">		<!-- 카카오 전송 templat내용 -->
+		<input type="hidden" id="agentCodeTxt" name="agentCodeTxt" value="">			<!-- 카카오 전송 templat Code -->
+		<input type="hidden" id="txtReplYn" name="txtReplYn" value="N">					<!-- 치환문자 여부 - -->
+		<input type="hidden" id="varNmList" name="varNmList" value="">					<!-- 변수 이름  리스트-->
+		<input type="hidden" id="varValList" name="varValList" value="">				<!-- 변수 리스트-->
+		<input type="hidden" id="bizJsonYn" name="bizJsonYn" value="">				<!-- 변수 리스트-->
+	</form>
+	
+	<!-- 유저 보유잔액 -->
+	<input type="hidden" id="oriUserMoney" value="<c:out value='${userMoney }' />">
+	
+	<!-- 각 금액 단가  -->
+	<input type="hidden" id="kakaoAtPrice" value="<c:out value='${sendPrice.kakaoAtPrice }' />"> <!-- 알림톡 단가  -->
+	<input type="hidden" id="longPrice" value="<c:out value='${sendPrice.longPrice }' />"> <!-- mms 단가  -->
+	<input type="hidden" id="shortPrice" value="<c:out value='${sendPrice.shortPrice }' />"> <!-- sms 단가  -->
+
+	<!-- 각 금액 단가  -->
+	<input type="hidden" id="errorChk" value="N"> <!-- sms 단가  -->
+	
+
+	<div class="tooltip-wrap">
+		<!-- 문자발송 성공 레이어팝업 -->
+		<div class="popup-com pop_msg_success">
+			<div class="popup_heading">
+				<p>알림톡 전송 결과</p>
+				<button type="button" class="tooltip-close" onclick="msgSuccessClose(this);"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
+			</div>
+			<div class="layer_in">
+				<div class="msg_text">발송 성공 : <strong>1</strong> 건,수신거부 : <span>0</span>건의<br>알림톡이 발송 되었습니다.</div>
+			</div>
+			<div class="popup_btn">
+				<button type="button" onclick="msgResultLink(); return false;">알림톡 발송결과 바로가기</button>
+				<button type="button" class="tooltip-close" onclick="msgSuccessClose(this);">확인</button>
+			</div>
+		</div>
+	</div>
+	<div class="tooltip-wrap">
+		<!-- 문자발송 실패 레이어팝업 -->
+		<div class="popup-com pop_msg_fails">
+			<div class="popup_heading">
+				<p>문자 전송 결과</p>
+				<button type="button" class="tooltip-close" onclick="msgFailsClose(this);"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
+			</div>
+			<div class="layer_in">
+				<div class="msg_text">발송 성공 : <strong>1</strong> 건,수신거부 : <span>0</span>건의<br>문자가 발송 되었습니다.</div>
+			</div>
+			<div class="popup_btn">
+				<button type="button" class="tooltip-close" onclick="msgFailsClose(this);">확인</button>
+			</div>
+		</div>
+	</div>
+	<div class="tooltip-wrap">
+		<!-- 문자발송 스팸 이용정지 레이어팝업 -->
+		<div class="popup-com pop_msg_spam">
+			<div class="popup_heading">
+				<p>문자 전송 결과</p>
+				<button type="button" class="tooltip-close" onclick="msgSpamClose(this);"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
+			</div>
+			<div class="layer_in">
+				<div class="msg_text"></div>
+			</div>
+			<div class="popup_btn">
+				<button type="button" class="tooltip-close" onclick="msgSpamClose(this);">확인</button>
+			</div>
+		</div>
+	</div>
+	<div class="inner">
+			<!-- send top -->
+			<div class="send_top">
+				<!-- tab button -->
+				<%@include file="/WEB-INF/jsp/web/kakao/include/KaKaoAlimtalkTopMenuTap.jsp" %>
+				<!--// tab button -->
+				<!-- 카카오톡 설정 - 알림톡 템플릿 등록/관리 - 내템플릿 -->
+				<div class="top_content kakaotalksend_cont current pay_tab_wrap">
+					<div class="send_general kakao_wrap">
+						<div class="send_left">
+							<table class="tType1">
+								<colgroup>
+									<col style="width: 90px;">
+									<col style="width: auto;">
+								</colgroup>
+								<tbody>
+									<tr>
+										<th>채널ID</th>
+										<td>
+											<label for="selectKakaoProfileList" class="채널ID 선택"></label>
+											<select class="select_gray_type" id="selectKakaoProfileList" name="selectKakaoProfileList">
+												<option value="">채널ID 선택</option>
+												<c:forEach var="kakaoProfileInfo" items="${kakaoProfileList}" varStatus="status">
+													<option value="${kakaoProfileInfo.senderKey}"><c:out value='${kakaoProfileInfo.yellowId}'/></option>
+												</c:forEach>
+											</select>
+											
+										</td>
+									</tr>
+									<tr>
+										<th>템플릿</th>
+										<td>
+											<select class="select_gray_type" id="selectTemplateList" name="selectTemplateList">
+<!--                                             <select name="" id="" class="select_gray_type"> -->
+												<option value="">알림톡 템플릿 선택</option>
+											</select>
+<!--                                             <button type="button" class="btnType btnType6" onclick="window.open('popup_allimtalk_template_choice.html','_blank','width=930, height=860, top=100, left=100, fullscreen=no, menubar=no, status=no, toolbar=no, titlebar=yes, location=no, scrollbars=yes')">템플릿 선택</button> -->
+											<button type="button" class="btnType btnType6"  onclick="javascript:fnTemplateReg(); return false;">템플릿 등록</button>
+											<div class="variable_wrap">
+												<ul>
+													<li>* 변수명 설정파일을 다운로드 받으신 후 전송대상과 변수를 입력 후 업로드해주세요.</li>
+													<li>* 엑셀서식은 반드시 <span>텍스트 서식으로 등록</span>해주세요.</li>
+													<li>* 한번에 전송가능한 <span>최대 발송건은 500건</span>입니다.</li>
+													<li>* 배송조회시 운송장 번호는 <span>숫자만 등록</span>해주세요.</li>
+												</ul>
+												<button type="button" class="excel_btn" onclick="excelDownload();"><i></i> <c:out value="#"/>{변수명} 설정 파일 다운로드</button>
+<!--                                                 <button type="button" class="excel_btn"><i></i> 변수명 설정 파일 다운로드</button> -->
+											</div>
+										</td>
+									</tr>
+									<tr>
+										<th>받는사람</th>
+										<td class="putText">
+											<div class="clearfix receipt_num receiver_wrap01">
+												<div class="receipt_num_top">
+													<label for="callTo" class="label">받는 번호입력</label>
+													<input type="text" id="callTo" name="callTo" oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');"  placeholder="번호를 입력하세요" onfocus="this.placeholder=''" onblur="this.placeholder='번호를 입력하세요'" style="width:340px;">
+													<button type="button" class="btnType btnType6 addCallToF">번호추가</button>
+													</br>
+													<span>
+														<span class="vMiddle">*</span> 중복번호는 한번만 발송됩니다.
+													</span>
+													</br>
+													<span>
+														<span class="vMiddle">*</span> 한번에 전송가능한 최대 발송건은 500건 입니다.
+													</span>
+												</div>
+												<div class="receipt_num_midde">
+													<div class="listType list01" >
+														<div class="list_table list_head">
+															<div class="cb_wrap">
+																<label for="select_all" class="label"></label>
+																<input type="checkbox" id="select_all">
+															</div>
+															<div class="list_table_num">
+																<p>휴대폰</p>
+<!--                                                                 <img src="/publish/images/sortUp.png"> -->
+<!--                                                                 <img src="/publish/images/sortDown.png"> -->
+															</div>
+<!-- 															<div class="list_table_name"> -->
+<!-- 																<p>이름</p> -->
+<!--                                                                 <img src="/publish/images/sortUp.png"> -->
+<!--                                                                 <img src="/publish/images/sortDown.png"> -->
+<!-- 															</div> -->
+														</div>
+														<div class="list_body_wrap" id="wrap01_body">
+														</div>
+													</div>
+													<div class="put_right">
+														<div class="btn_popup_wrap spc_wrap">
+															<button type="button" data-tooltip="popup06" class="btnType btnType7 popupAddr">주소록 불러오기</button>
+														</div>
+														<div class="btn_popup_wrap">
+															<button type="button" data-tooltip="popup02" class="btnType btnType7">엑셀 불러오기</button>
+														</div>
+														<div class="btn_popup_wrap">
+															<button type="button" data-tooltip="popup03" class="btnType btnType7 tab1">최근 전송내역</button>
+														</div>
+														<div class="btn_popup_wrap">
+															<button type="button" data-tooltip="popup03" class="btnType btnType7 tab2">자주보내는 번호</button>
+														</div>
+														<div class="btn_popup_wrap check_validity_wrap">
+															<button type="button" class="btnType btnType7" id="check_validity">오류검사 <i class="qmMark"></i></button>
+															<div class="error_hover_cont send_hover_cont">
+																<p>휴대폰 번호 입력 시 해당 휴대폰 번호에 대한 형식이 어긋나거나 휴대폰 번호에 오류가 있는지 등을 검사하는 기능</p>
+																<span>(예시) 010-1234-0001(O) / 010-123-0001(X)</span>
+															</div>
+														</div>
+													</div>
+												</div>
+												<div class="list_bottom clearfix">
+													<div class="remove_btnWrap">
+														<button type="button" class="btnType15" id="all_del"><i class="remove_img"></i>전체삭제</button>
+														<button type="button" class="btnType15" id="select_del"><i class="remove_img"></i>선택삭제</button>
+													</div>
+													<div class="list_bottom_right">
+														<p>총 <span class="c_e40000" id="rowTotCnt">0</span>건 / 중복 <span class="c_002c9a" id="rowDupCnt">0</span>건</p>
+<!-- 														<button type="button" class="address_reg2">주소록에 등록</button> -->
+													</div>
+												</div>
+											</div>
+											<div class="clearfix receipt_num receiver_wrap02">
+												<div class="receipt_num_top">
+													<input type="text" placeholder="선택된 파일이 없습니다." onfocus="this.placeholder=''" onblur="this.placeholder='번호를 입력하세요'" style="width:340px;">
+													<button type="button" class="btnType btnType6" id="fileClick"/>파일선택</button>
+													<input type="file" id="excelFile" accept=".xls, .xlsx" onchange="excelExportVarAjax(event); return false;" style="display:none"/>
+													<!-- <input type="file" id="excelFile" accept=".xls, .xlsx" onchange="excelExport02(event); return false;" style="display:none"/> -->
+												</div>
+												<div class="receipt_num_midde">
+													<div class="listType list01" id="wrap02">
+														<!-- /publish/kakao_allimtalk_send.html 참고 -->
+														<div class="list_table list_head" id="excelHead">
+														</div>
+														<div class="list_body_wrap" id="excelBody02">
+														</div>
+													</div>
+												</div>
+											</div>
+										</td>
+									</tr>
+									<tr>
+										<th colspan="2" class="billingAmount">
+											<div>
+												<div class="final_pay">
+													<div class="pay_info_list">
+														<p>발송금액 :</p>
+                                                        <div class="info" id="repPriceTxt" style="display: none;">
+<!-- 														<div class="info" id="repPriceTxt"> -->
+<!-- 															단문 : <strong>20</strong>건<span>/</span> -->
+<!-- 															장문 :<strong>150</strong>건<span>/</span> -->
+<!-- 															그림문자 :<strong>30</strong>건 -->
+														</div>
+													</div>
+													<p class="price"><span id="repPriceTxt"></span><span id="totalPriceTxt">0.0</span> 원<span></span></p>
+												</div>
+												<div class="pay_type clearfix">
+								  					<fmt:formatNumber type="number" maxFractionDigits="3" value="${userMoney}" var="commaPrice" />
+													<div>
+														<input type="radio" id="radio_bill_1" name="radio_bill" checked="checked">
+														<label for="radio_bill_1">보유잔액</label>
+														<label for="userMoney" class="la bel">보유잔액</label>
+														<input type="text" id="userMoney" name="userMoney" value="<c:out value='${commaPrice}'/>" readonly>
+														<span class="won">원</span>
+														<button type="button" class="btnType btnType21" onclick="location.href='/web/member/pay/PayView.do'">충전</button>
+													</div>
+													<div></div>
+												</div>
+											</div>
+										</th>
+									</tr>
+									<tr>
+										<th colspan="2" class="replace_send_th">
+											<div class="title_th"><p>대체문자</p> 
+												<input type="checkbox" id="send_fail_check" style="margin: 0 8px 0 0;"><label for="send_fail_check">알림톡 전송 실패 시 문자 전송</label>
+											</div>
+											<div class="replace_send_wrap">
+<!--                                             <div class="replace_send_wrap"  style="display: block;"> -->
+												<table class="tType1">
+													<colgroup>
+														<col style="width: 90px;">
+														<col style="width: auto;">
+													</colgroup>
+													<tbody>
+														<tr>
+															<th>발신번호</th>
+															<td class="put_num">
+																<label for="callFromList" class="label"></label>
+																<select id="callFromList" name="callFromList" class="sel_number">
+																	<c:choose>
+																		<c:when test="${not empty resultPhonList}">
+																			<c:forEach var="phonList" items="${resultPhonList}" varStatus="status">
+																				<option value="${phonList}">${phonList}</option>
+																			</c:forEach>
+																		</c:when>
+																		<c:otherwise>
+																			<option value="">등록된 발신 번호가 없습니다.</option>
+																		</c:otherwise>
+																	</c:choose>
+																</select>
+																<button type="button" class="btnType btnType6" onclick="location.href='/web/user/sendNumberManage.do'">번호등록</button>
+															</td>
+														</tr>
+														<tr>
+															<th>내용</th>
+															<td class="putText">
+																<div class="clearfix">
+																	<div class="put_left short">
+																		<!-- 업로드한 이미지의 썸네일 영역 -->
+																		<ul class="thumb_wrap liOnImg ui-sortable"></ul>
+																		<!-- //업로드한 이미지의 썸네일 영역 -->
+																		<label for="smsTxtArea" class="label"></label>
+																		<textarea id="smsTxtArea" name="smsTxtArea" class="put_text"></textarea>
+																		<div class="text_length">
+																			<div name="afterDeny" id="afterDeny">
+																				<p>
+																					<span class="fwMd" id="msgLeng">0 /
+																					</span>
+																					<span class="c_002c9a fwMd" id="limitLeng">90</span>byte
+																				</p>
+																				<span
+																					class="msg_com msg_short">단문</span>
+																			</div>
+																		</div>
+																	</div>
+																	<div class="put_right">
+																		<button type="button" class="btnType btnType9" id="failCheckInit">초기화</button>
+                                                                        <button type="button" class="btnType btnType7" onclick="javascript:fn_errorChk(); return false;">오류검사<i class="qmMark"></i></button>
+<!--                                                                         <button type="button" class="btnType btnType8" onclick="showPotoediter();">이미지 불러오기</button> -->
+<!--                                                                         <div class="send_btnWrap"> -->
+<!--                                                                             <button type="button" class="btnType btnType9">문자저장</button> -->
+<!-- 																		</div> -->
+																	</div>
+
+																</div>
+<!--                                                                 <p id="lowText">* 현재 [<span id="nowMsgType">단문</span>] <span class="c_e40000 fwBold nowMsgCnt">0</span>건 발송 가능합니다.</p> -->
+															</td>
+														</tr>
+													</tbody>
+												</table>
+											</div>
+										</th>
+									</tr>
+								</tbody>
+							</table>
+						</div>
+						<div class="send_right">
+							<div class="phone">
+								<div class="phoneIn">
+									<p class="prev_p" id="prev_p_top"><img src="/publish/images/content/kakao_prev_icon.png" alt=""></p>
+									<!-- 텍스트 미리보기 -->
+									<div class="text_preview">
+										<div class="allimtalk_title">
+											<img src="/publish/images/content/icon_allimtalk.png" alt="">알림톡 도착
+										</div>
+										<div class="allimtalk_content" id="alimtalkTemplate">
+											<p class="emphasis_side_text">템플릿을 선택해 주세요</p>
+										</div>
+									</div>
+									<!-- //텍스트 미리보기 -->
+									<div class="template_info_wrap">
+										<div class="template_byte">
+<!--                                             <p><span class="fwMd" id="msgLeng">50 / </span><span class="c_002c9a fwMd" id="limitLeng">2000</span>byte</p> -->
+										</div>
+										<button type="button" class="btn_template_choice" id="reSelectBtn">템플릿 재선택</button>
+									</div>
+								</div>
+								<p class="addText">※ 단말기 설정에 따라 다르게 보일 수 있습니다<p>
+							</div>
+							<div class="phone_bottom">
+								<div class="send_rev">
+									<div class="send_content" style="padding-bottom: 0;">
+										<div class="rev_radio">
+											<ul>
+												<li>
+													<input type="radio" id="reserYnN" name="reserYn" value="N" checked="checked"><label for="reserYnN">즉시</label>
+												</li>
+												<li>
+													<input type="radio" id="reserYnY" name="reserYn" value="Y"><label for="reserYnY">예약</label>
+												</li>
+											</ul>
+										</div>
+										<div class="send_btn">
+											<button type="button" class="btnType btnType11" onclick="javascript:sendTemplateInfo(); return false;">발송하기</button>
+											<button type="button" class="btnType btnType10" onclick="javascript:goToKakaoTestPopUp(); return false;">테스트발송</button>
+										</div>
+									</div>
+									<div class="rev_selected">
+										<div class="rev_top">
+											<span>날짜 :</span>
+											<div class="calendar_wrap">
+												<input type="text" class="startDate2 inp resDate calendar picker__input picker__input--active" title="검색 시작일" id="startDate2" name="startDate2" value="" data-datecontrol="true" readonly="" aria-haspopup="true" aria-expanded="true" aria-readonly="false" aria-owns="startDate2_root">
+											</div>
+											<label for="msgResHour" class="label">시 선택</label>
+											<div class="selBox">
+												<select class="selType1" id="msgResHour" name="msgResHour">
+													<c:forEach  var="hour"  begin="0" end="23" step="1" varStatus="status">
+														<c:choose>
+															<c:when test="${hour < 10}">
+																<option value="0${hour}">0${hour}시</option>
+															</c:when>
+															<c:otherwise>
+																<option value="${hour}">${hour}시</option>
+															</c:otherwise>
+														</c:choose>
+													</c:forEach>
+												</select>
+												<label for="msgResMin" class="label">분 선택</label>
+												<select class="selType1" id="msgResMin" name="msgResMin">
+													<c:forEach var="min" begin="0" end="55" step="5">
+														<c:choose>
+															<c:when test="${min < 10}">
+																<option value="0${min}">0${min}분</option>
+															</c:when>
+															<c:otherwise>
+																<option value="${min}">${min}분</option>
+															</c:otherwise>
+														</c:choose>
+													</c:forEach>
+												</select>
+											</div>
+										</div>
+										<div class="rev_bottom">
+											<input type="checkbox" id="inputDivideChk" name="inputDivideChk">
+											<label for="inputDivideChk">분할전송</label>
+											<input type="text" class="dividType1" id="frmDivideCnt" name="frmDivideCnt" value="20" onkeypress='return checkNumber(event)' maxlength="4"/>
+     		            					<label for="frmDivideCnt">건씩</label>
+											<select class="selType1" id="divideTime" name="divideTime">
+						 						<option value="5">05분</option>
+						 						<option value="10">10분</option>
+						 						<option value="15">15분</option>
+						 						<option value="20">20분</option>
+						 						<option value="30">30분</option>
+						 					</select>
+						 					<label for="divideTime">간격</label>
+										</div>
+									</div>
+								</div>
+							</div>
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+		<!--// send top -->
+		
+<!-- 주소록 불러오기 -->
+<div class="tooltip-wrap">
+	<div class="popup-com import_layer popup06" tabindex="0" data-tooltip-con="popup06" data-focus="popup06" data-focus-prev="popup06-close" style="width: 1000px">
+		<div class="popup_heading">
+			<p><span>주소록 불러오기</p>
+			<button type="button" onClick="javascript:addrClose(); return false;">
+			<img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
+		</div>
+		<div class="layer_in">
+			<div class="titBox titBox_pad">
+				<p>- 주소록 수정 및 변경은 <span>[주소록 관리]</span>에서만 가능합니다.</p>
+				<button type="button" class="adr_admin" onClick="location.href='/web/mjon/addr/selectAddrList.do'">주소록 관리</button>
+			</div>
+			<div class="adr_wrap">
+				<form id="searchAddrGrpForm" name="searchAddrGrpForm" method="post" style="display: flex; justify-content: space-between;">
+					<input type="hidden" id="searchAddrGrpId" name="searchAddrGrpId" value=""/>
+					<input type="hidden" id="type" name="type" value="all"/>
+					<input type="hidden" id="searchKeyword" name="searchKeyword" value=""/>
+					<input type="hidden" name="searchCondition" id="searchCondition" value="0" />
+					<div class="adr_pop_left">
+						<div class="adr_left_search">
+							<label for="searchGrpKeyword" class="label">그룹명 검색</label>
+							<input type="text" name="searchGrpKeyword" id="searchGrpKeyword"  placeholder="그룹명 검색" onfocus="this.placeholder=''" onblur="this.placeholder='그룹명 검색'" class="inputLight">
+							<button type="button" onClick="javascrit:fnAddrGrpSearch(); return false;"><img src="/publish/images/popup/search.png" alt="검색"></button>
+						</div>
+						<div class="adr_pop_box">
+							<div id="addrGroupLoad">
+							</div>
+						</div>
+						<!-- <div class="popup_btn">
+							<button type="button" class="btnType" onClick="javascript:fnSelectAddrGrpList(); return false;">선택 그룹 추가</button>
+						</div> -->
+					</div>
+					<div class="adr_pop_right">
+						<div class="clearfix">
+							<div class="btnWrap_last">
+								<label for="searchAddrCondition" class="label">카테고리 선택</label>
+								<select id="searchAddrCondition" name="searchAddrCondition" class="selType2">
+									<option value='0'>전체</option>
+									<option value='1'>그룹명</option>
+									<option value='2'>이름</option>
+									<option value='3'>핸드폰번호</option>
+								</select>
+								<label for="searchAddrKeyword" class="label">검색어 입력</label>
+								<input type="text" id="searchAddrKeyword" name="searchAddrKeyword" placeholder="검색어를 입력하세요"  onfocus="this.placeholder=''" onblur="this.placeholder='검색어를 입력하세요'" >
+								<button type="button" class="btnType btnType17"  onClick="javascrit:fnAddrSearch(); return false;">검색</button>
+							</div>
+							<!-- table -->
+							<div class="adr_excel adr_pop_list2 callAddr_box">
+							</div>
+							<!--// table -->
+						</div>
+						<div class="popup_btn_wrap2">
+							<button type="button" onClick="javascript:addrToList(); return false;">추가</button>
+							<button type="button" onClick="javascript:addrClose(); return false;">닫기</button>
+						</div>
+						<%-- 주소록 레이어 팝업 닫기 실행 코드 --%>
+						<input type="hidden" name="btnAddrClose" id="btnAddrClose" class="tooltip-close closeAddr" data-focus="popup06-close" />         
+					</div>
+				</form>
+			</div>
+		</div>
+	</div>
+</div>
+<!--// 주소록 불러오기 -->
+
+<!-- 최근 전송 내역 -->
+<div class="tooltip-wrap">
+	<div class="popup-com history_layer popup03" tabindex="0" data-tooltip-con="popup03" data-focus="popup03" data-focus-prev="popup03-close">
+		<div class="popup_heading">
+			<p><span>전송내역</p>
+			<button type="button" class="tooltip-close" data-focus="popup03-close" id="btnLatestAddPhoneClose"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
+		</div>
+		<div class="layer_in">
+			<!-- tab button -->
+			<ul class="tabType6"> 
+				<li class="tab active"><button type="button" onclick="TabType(this,'1');">최근 전송내역</button></li>
+				<li class="tab"><button type="button" onclick="TabType(this,'2');">자주보내는 번호</button></li>
+			</ul><!--// tab button -->
+			<!-- 최근 전송내역 -->
+			<div class="history_cont hascont current">
+				<div class="histroy_trans latestMsgArea" id="latestMsgArea">
+					<ul id="latestMsgUl">
+						<c:choose>
+							<c:when test="${not empty resultLatestMsgList}">
+								<c:forEach var="latestMsgList" items="${resultLatestMsgList}" varStatus="status">
+									<li id="latestLi">
+										<input type="checkbox" id="addrChk_${status.count}" name="latAddrChk" value="<c:out value='${latestMsgList.callTo}'/>">
+										<label for="addrChk_${status.count}" class="label">최근 전송내역</label>
+										<p><c:out value="${latestMsgList.callTo}"/></p>
+										<button type="button" id="latestAddrDel"><img src="/publish/images/popup/close3.png"  alt="전화번호 삭제"></button>
+									</li>
+								</c:forEach>
+							</c:when>
+							<c:otherwise>
+								<li>
+									<p>최근 발송 내역이 없습니다.</p>
+								</li>
+							</c:otherwise>
+						</c:choose>
+					</ul>
+				</div>
+				<div class="popup_btn_wrap2 hisroy_btn">
+					<button type="button" id="latestAddPhone">선택추가</button>
+					<button type="button" id="latestCancelPhone">선택취소</button>
+				</div>
+			</div><!--// 최근 전송내역 -->
+			<!-- 자주보내는 번호 -->
+			<div class="history_cont hascont">
+				<div class="histroy_trans" id="bookMarkMsgArea">
+					<ul id="bookMsgUl">
+						<c:choose>
+							<c:when test="${not empty resultBookMarkMsgList}">
+								<c:forEach var="bookMarkMsgList" items="${resultBookMarkMsgList}" varStatus="status">
+									<li id="bookMarkLi">
+										<input type="checkbox" id="bokAddrChk_${status.count}" name="bookAddrChk" value="<c:out value='${bookMarkMsgList.addrPhoneNo}'/>">
+										<label for="addrChk_${status.count}" class="label">최근 전송내역</label>
+										<p><c:out value="${bookMarkMsgList.addrPhoneNo}"/></p>
+										<button type="button" id="bookMarkAddrDel"><img src="/publish/images/popup/close3.png"  alt="전화번호 삭제"></button>
+									</li>
+								</c:forEach>
+							</c:when>
+							<c:otherwise>
+								<li>
+									<p>등록된 자주 보내는 번호 내역이 없습니다.</p>
+								</li>
+							</c:otherwise>
+						</c:choose>
+					</ul> 
+				</div>
+				<div class="popup_btn_wrap2 hisroy_btn">
+					<button type="button" id="bookMarkAddPhone">선택추가</button>
+					<button type="button" id="bookMarkCancelPhone">선택취소</button>                      
+				</div>
+			</div><!--// 자주보내는 번호  -->         
+		</div>
+	</div>
+</div>
+<!--// 전송내역 팝업 -->
+
+
+
+<!-- 엑셀 불러오기 -->
+<form id="excelToolTipForm" name="excelToolTipForm" method="post">
+	<div class="tooltip-wrap">
+		<div class="popup-com import_layer popup02" tabindex="0" data-tooltip-con="popup02" data-focus="popup02" data-focus-prev="popup02-close">
+			<div class="popup_heading">
+				<p><span>엑셀</span> 불러오기</p>
+				<button type="button" class="tooltip-close" data-focus="popup02-close"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
+			</div>
+			<div class="layer_in">
+				<!-- 엑셀파일 불러오기 -->
+				<div class="hascont">
+					<div class="titBox">
+						<p>- 최대 2만 건까지 등록할 수 있습니다.</p>
+						<p>- [엑셀 불러오기]시 문서의 A, B열을 불러옵니다.(지원하는 파일 형식 : xls, xlsx)</p>
+						<p>- 휴대폰 항목은 숫자, 하이픈(-)만 인식하며, 번호 앞에 0이 생략되어도 정상 등록됩니다.
+						</p>
+						<!-- <button type="button" class="excel_btn" onclick="location.href='/cmm/fms/FileDown.do?atchFileId=FILE_000000000011651&fileSn=1'"><i></i>샘플파일 다운로드</button> -->
+						<button type="button" class="excel_btn" onclick="location.href='/download/msg/알림톡_엑셀주소록_등록양식.xlsx'"><i class="downroad"></i>샘플파일 다운로드</button>
+					</div>
+					<div class="attachedFile">
+						<label for="excelNm01" class="attachedFile_label">첨부파일</label>
+						<input type="text" id="excelNm01" value="" readonly>
+						<input type="file" id="excelFile01" accept=".xls, .xlsx" onchange="excelExportAjax(event); return false;" style="display:none"/>
+						<!-- <input type="file" id="excelFile01" accept=".xls, .xlsx" onchange="excelExport01(event); return false;" style="display:none"/> -->
+						<button type="button" class="btnType btnType6 c1">찾아보기</button>
+<!-- 						<p><span class="vMiddle">*</span> 첨부된 파일은 <span class="c_e40000">[추가]버튼을 클릭</span>하셔야 받는 사람에 등록됩니다.</p> -->
+						<p><span class="vMiddle">*</span> 첨부된 파일은 <span class="c_e40000">[추가]버튼을 클릭</span>하셔야 받는 사람에 등록됩니다.</p>
+					</div>
+				</div><!--// 엑셀파일 불러오기 -->
+				<div class="popup_btn_wrap2">
+					<button type="button" class="tooltip-close" data-focus="popup02-close"  data-focus-next="popup02" onclick="excelAddAjax()">추가</button>
+					<!-- <button type="button" class="tooltip-close" data-focus="popup02-close"  data-focus-next="popup02" onclick="excelAdd()">추가</button> -->
+					<button type="button" class="tooltip-close" data-focus="popup02-close"  data-focus-next="popup02">닫기</button>                      
+				</div>
+			</div>
+		</div>
+	</div><!--// 엑셀 불러오기 -->
+</form>
+<form id="excelVarFileForm" name="excelVarFileForm" method="post">
+	<input type="hidden" id="excelVarCnt" name="excelVarCnt" value="0"/>
+	<input type="hidden" id="excelVarList" name="excelVarList" value=""/>
+	
+</form>
+
+<form id="msgResendForm" name="msgResendForm" method="post">
+	<input name="msgResendFlag" type="hidden" value="N"/>
+	<input name="msgSeqList" type="hidden" value=""/>
+</form>
+<form id="moveAddrForm" name="moveAddrForm" method="post">
+	<input name="moveAddrFlag" type="hidden" value="N"/>
+	<input name="addrIdList" type="hidden" value=""/>
+</form>
Add a comment
List