function fnReplCell_advc(){ console.log(':: fnReplCell_advc ::'); // 함수 실행 로그 let smsTxtArea = $('#smsTxtArea').val(); // 문자 내용을 가져옴 const adTxt = $('.ad_txt').text(); // 광고 문구 const denyTxt = $('.deny_txt').text(); // 수신 거부 문구 const recTableData = tableL.getRows(); // 받는사람 리스트 // 광고 문구와 수신 거부 문구를 문자 내용에 추가 if (adTxt && denyTxt) { smsTxtArea = `${adTxt}\n${smsTxtArea}\n${denyTxt}`; } // 문자 내용에 치환 문자열이 포함되어 있는지 확인 if (!SmsTextProcessor.hasPlaceholders(smsTxtArea)) return; $('#txtReplYn').val("Y"); // 치환 여부 상태값 설정 // 받는사람 데이터가 없는 경우 종료 if (!recTableData.length) return; try { // 문자 내용을 처리하고 단문/장문 카운트를 얻음 const msgCount = SmsTextProcessor.processSmsText(smsTxtArea, recTableData); // 총 가격 계산 및 업데이트 replTotalPriceSum(msgCount.short, msgCount.long, recTableData.length); $('#txtReplYn').val("Y"); // 일괄변환문자 포함 여부 설정 } catch (error) { console.error(error.message); // 오류 메시지 로그 } } //특정문구 일괄변환 문자길이 체크 하기 function fnReplCell(){ var smsTxtArea = $('#smsTxtArea').val(); var imgCnt = $("#imgCnt").val(); // 현재 페이지에 첨부된 이미지 갯수 var orgSmsTxt = smsTxtArea; // 광고문자 뺀 문자내용 var adTxt = $('.ad_txt').text(); var denyTxt = $('.deny_txt').text(); var adverTxt = ""; //이벤트 잔여 캐시 자동 처리 관련 변수 var evnRemainCash = parseFloat($("#eventRemainCash").val()); //이벤트 잔여 캐시 금액 var evnEachPrice = parseFloat($("#eachPrice").val()); var evnShortPrice = parseFloat($("#sPrice").val()); var evnLongPrice = parseFloat($("#mPrice").val()); var evnPhoneNumCnt = 0; var evnShortMsgCnt = 0; var evnLongMsgCnt = 0; var evnMsgCntSts = true; if(adTxt.length > 0 && denyTxt.length > 0){ adverTxt = adTxt + "\n" + smsTxtArea + "\n" + denyTxt; smsTxtArea = adverTxt; } console.log('???smsTxtArea :: ', smsTxtArea); if(smsTxtArea.indexOf("[*이름*]") > -1 || smsTxtArea.indexOf("[*1*]") > -1 || smsTxtArea.indexOf("[*2*]") > -1 || smsTxtArea.indexOf("[*3*]") > -1 || smsTxtArea.indexOf("[*4*]") > -1){ var rowData = tableL.getRows(); var recTableData = tableL.getRows(); // 받는사람 리스트의 전체 목록을 저장 //var tableData = []; var msg_short = 0; //단문문자 갯수 var msg_long = 0; //장문문자 갯수 //일괄변환문자 포함 여부 변경 - 문자내용에 치환변환 문자는 있지만 받는사람 데이터에 치환 데이터를 안넣는 경우 오류가 발생하여 상태값 입력 위치 상단으로 변경함. //치환데이터가 없는 경우 Alert 띄우고 빠져나가기 때문에 치환문자 상태 체크값이 누락되어서 변경함 - 20230407 우영두 $('#txtReplYn').val("Y"); var nmStatus = false; var rep1Status = false; var rep2Status = false; var rep3Status = false; var rep4Status = false; if(smsTxtArea.indexOf("[*이름*]") > -1){ nmStatus = true; } if(smsTxtArea.indexOf("[*1*]") > -1){ rep1Status = true; } if(smsTxtArea.indexOf("[*2*]") > -1){ rep2Status = true; } if(smsTxtArea.indexOf("[*3*]") > -1){ rep3Status = true; } if(smsTxtArea.indexOf("[*4*]") > -1){ rep4Status = true; } //기존 받는사람 리스트를 배열에 미리 담아둔다. if(recTableData.length > 0){ for(var j=0; j < recTableData.length; j++){ var smsTxt = smsTxtArea; if(typeof recTableData[j].getData().name != 'undefined' && recTableData[j].getData().name != null && recTableData[j].getData().name != ""){ // console.log('name : ', name); // console.log('smsTxt : ', smsTxt); // console.log('orgSmsTxt : ', orgSmsTxt); var name = recTableData[j].getData().name; smsTxt = stringReplaceAll(smsTxt, "[*이름*]", name); orgSmsTxt = stringReplaceAll(orgSmsTxt, "[*이름*]", name);//광고, 선거 문자인 경우 상하단 문구 제거한 문자내용만 보여주도록 함. 치환문자 있으면 변환해서 보여줌 }/*else{ if(nmStatus){ alert("[*이름*] 치환 문자에 데이터가 없습니다. 받는사람 목록의 치환 데이터를 확인해 주세요."); return false; } }*/ if(typeof recTableData[j].getData().rep1 != 'undefined' && recTableData[j].getData().rep1 != null && recTableData[j].getData().rep1 != ""){ var rep1 = recTableData[j].getData().rep1; smsTxt = stringReplaceAll(smsTxt, "[*1*]", rep1); orgSmsTxt = stringReplaceAll(orgSmsTxt, "[*1*]", rep1); }/*else{ if(rep1Status){ alert("[*1*] 치환 문자에 데이터가 없습니다. 받는사람 목록의 치환 데이터를 확인해 주세요."); return false; } }*/ if(typeof recTableData[j].getData().rep2 != 'undefined' && recTableData[j].getData().rep2 != null && recTableData[j].getData().rep2 != ""){ var rep2 = recTableData[j].getData().rep2; smsTxt = stringReplaceAll(smsTxt, "[*2*]", rep2); orgSmsTxt = stringReplaceAll(orgSmsTxt, "[*2*]", rep2); }/*else{ if(rep2Status){ alert("[*2*] 치환 문자에 데이터가 없습니다. 받는사람 목록의 치환 데이터를 확인해 주세요."); return false; } }*/ if(typeof recTableData[j].getData().rep3 != 'undefined' && recTableData[j].getData().rep3 != null && recTableData[j].getData().rep3 != ""){ var rep3 = recTableData[j].getData().rep3; smsTxt = stringReplaceAll(smsTxt, "[*3*]", rep3); orgSmsTxt = stringReplaceAll(orgSmsTxt, "[*3*]", rep3); }/*else{ if(rep3Status){ alert("[*3*] 치환 문자에 데이터가 없습니다. 받는사람 목록의 치환 데이터를 확인해 주세요."); return false; } }*/ if(typeof recTableData[j].getData().rep4 != 'undefined' && recTableData[j].getData().rep4 != null && recTableData[j].getData().rep4 != ""){ var rep4 = recTableData[j].getData().rep4; smsTxt = stringReplaceAll(smsTxt, "[*4*]", rep4); orgSmsTxt = stringReplaceAll(orgSmsTxt, "[*4*]", rep4); }/*else{ if(rep4Status){ alert("[*4*] 치환 문자에 데이터가 없습니다. 받는사람 목록의 치환 데이터를 확인해 주세요."); return false; } }*/ var msgLen = conByteLeng(smsTxt); if(msgLen < 1){ }else if(msgLen > 2000){ alert("문자 내용은 2000byte를 넘을 수 없습니다."); return false; }else{ if(msgLen > 90){ msg_long++; console.log(evnRemainCash + " === " + evnLongPrice); if(evnRemainCash >= evnLongPrice && evnMsgCntSts == true){//이벤트 금액으로 보낼수 있으면 카운팅 evnRemainCash = evnRemainCash - evnLongPrice; evnPhoneNumCnt++; evnLongMsgCnt++; $("#evnPhoneNumCnt").val(evnPhoneNumCnt); $("#evnLongMsgCnt").val(evnLongMsgCnt); }else{//이벤트 금액으로 보낼수 없으면 카운팅 중지 evnMsgCntSts = false; } }else{ msg_short++; console.log(evnRemainCash + " === " + evnShortPrice); if(evnRemainCash >= evnShortPrice && evnMsgCntSts == true){//이벤트 금액으로 발송할 수 있으면 카운팅 evnRemainCash = evnRemainCash - evnShortPrice; evnPhoneNumCnt++; evnShortMsgCnt++; $("#evnPhoneNumCnt").val(evnPhoneNumCnt); $("#evnShortMsgCnt").val(evnShortMsgCnt); }else{//이벤트 금액으로 보낼수 없으면 카운티 중지 evnMsgCntSts = false; } } } replTotalPriceSum(msg_short, msg_long, totRows); //첫번째 수신자의 변환 텍스트 내용을 적용하여 미리보기 문자내용에 보여주자. if(j == 0){ console.log('adverTxt : ', adverTxt); //미리보기에 내용 입력해 주기 if(adverTxt.length > 0){ $('.realtime').text(orgSmsTxt); }else{ $('.realtime').text(smsTxt); } } //일괄변환문자 포함 여부 변경 //$('#txtReplYn').val("Y"); } //변환후 문자 중에 장문이 1개 이상 있는 경우 문자 제목을 입력해 주기 /*var txtReplYn = $('#txtReplYn').val(); if(txtReplYn == 'Y' && (msg_long > 0 || imgCnt > 0)){ //장문, 그림 문자가 포함되어 있는 경우 제목을 입력하도록 처리 $('#mmsSubject').attr("disabled", false); }else if(txtReplYn == 'Y' && msg_long < 1){ //일괄변환애 단문문자만 있는경우 제목 입력 안되도록 처리 $('#mmsSubject').val(""); $('#mmsSubject').attr("disabled", true); }*/ } } } // 문자 처리 객체 const SmsTextProcessor = { // 치환 문자열 배열 placeholders: ["[*이름*]", "[*1*]", "[*2*]", "[*3*]", "[*4*]"], // 치환 문자열이 포함되어 있는지 확인 hasPlaceholders(smsTxt) { // smsTxt에서 placeholders 중 하나라도 포함되면 true 반환 return this.placeholders.some(ph => smsTxt.includes(ph)); }, // 문자 내용을 치환하는 함수 replacePlaceholders(text, data) { // 치환 문자열 키와 값을 매핑하여 처리 return this.placeholders.reduce((result, ph, index) => { // 치환 키 설정 (예: [*1*], [*2*]) const key = index === 0 ? "name" : `rep${index}`; // 데이터 값이 없으면 치환 문자열 그대로 유지 const value = data[key] !== undefined && data[key] !== null ? data[key] : ph; // console.log(`Replacing ${ph} with ${value}:`); // 디버깅 로그 // 현재 치환 문자열만 교체 // return result.replace(new RegExp(`\\${ph}(?!\\[)`, "g"), value); return stringReplaceAll(result, ph, value) }, text); } , // 문자 길이를 계산하고 메시지 유형(단문/장문) 카운트 processMessageLength(smsTxt, msgCount) { // 문자 길이(byte) 계산 const msgLen = conByteLeng(smsTxt); //console.log('msgLen : ', msgLen); //console.log('smsTxt : ', smsTxt); // 2000byte 초과시 오류 발생 if (msgLen > 2000) { alert("문자 내용은 2000byte를 넘을 수 없습니다."); throw new Error("문자 내용 초과"); } // 길이에 따라 장문/단문 카운트 증가 if (msgLen > 90) { msgCount.long++; } else { msgCount.short++; } return msgCount; // 업데이트된 카운트 반환 }, // 문자 내용 처리 함수 processSmsText(smsTxtArea, rowData) { const msgCount = { short: 0, long: 0 }; // 단문/장문 초기화 // 수신자 데이터가 없는 경우 원본 문자 유지 if (!rowData || rowData.length === 0) { $('.realtime').text(smsTxtArea); return msgCount; } // 받는사람 데이터 순회 rowData.forEach((row, index) => { // 문자 내용을 개별 데이터로 치환 let smsTxt = this.replacePlaceholders(smsTxtArea, row.getData()); // 문자 길이를 계산하고 카운트를 업데이트 this.processMessageLength(smsTxt, msgCount); // 첫 번째 수신자의 변환 결과를 미리보기로 설정 if (index === 0) { // console.log('smsTxt : ',smsTxt); $('.realtime').text(smsTxt); // 화면에 표시 } }); return msgCount; // 최종 카운트 반환 } }; //특정문구 일괄변환 문자길이 체크 하기 function fnReplCellExcel(){ console.log('fnReplCellExcel'); var smsTxtArea = $('#smsTxtArea').val(); var imgCnt = $("#imgCnt").val(); // 현재 페이지에 첨부된 이미지 갯수 var orgSmsTxt = smsTxtArea; // 광고문자 뺀 문자내용 var adTxt = $('.ad_txt').text(); var denyTxt = $('.deny_txt').text(); var adverTxt = ""; //이벤트 잔여 캐시 자동 처리 관련 변수 var evnRemainCash = parseFloat($("#eventRemainCash").val()); //이벤트 잔여 캐시 금액 var evnEachPrice = parseFloat($("#eachPrice").val()); var evnShortPrice = parseFloat($("#sPrice").val()); var evnLongPrice = parseFloat($("#mPrice").val()); var evnPhoneNumCnt = 0; var evnShortMsgCnt = 0; var evnLongMsgCnt = 0; var evnMsgCntSts = true; if(adTxt.length > 0 && denyTxt.length > 0){ adverTxt = adTxt + "\n" + smsTxtArea + "\n" + denyTxt; smsTxtArea = adverTxt; } if(smsTxtArea.indexOf("[*이름*]") > -1 || smsTxtArea.indexOf("[*1*]") > -1 || smsTxtArea.indexOf("[*2*]") > -1 || smsTxtArea.indexOf("[*3*]") > -1 || smsTxtArea.indexOf("[*4*]") > -1){ var rowData = tableR.getRows(); var recTableData = tableR.getRows(); // 받는사람 리스트의 전체 목록을 저장 //var tableData = []; var msg_short = 0; var msg_long = 0; var nmStatus = false; var rep1Status = false; var rep2Status = false; var rep3Status = false; var rep4Status = false; if(smsTxtArea.indexOf("[*이름*]") > -1){ nmStatus = true; } if(smsTxtArea.indexOf("[*1*]") > -1){ rep1Status = true; } if(smsTxtArea.indexOf("[*2*]") > -1){ rep2Status = true; } if(smsTxtArea.indexOf("[*3*]") > -1){ rep3Status = true; } if(smsTxtArea.indexOf("[*4*]") > -1){ rep4Status = true; } //일괄변환문자 포함 여부 변경 - 문자내용에 치환변환 문자는 있지만 받는사람 데이터에 치환 데이터를 안넣는 경우 오류가 발생하여 상태값 입력 위치 상단으로 변경함. //치환데이터가 없는 경우 Alert 띄우고 빠져나가기 때문에 치환문자 상태 체크값이 누락되어서 변경함 - 20230407 우영두 $('#txtReplYn').val("Y"); //기존 받는사람 리스트를 배열에 미리 담아둔다. if(recTableData.length > 0){ for(var j=0; j < recTableData.length; j++){ var smsTxt = smsTxtArea; if(typeof recTableData[j].getData().name != 'undefined' && recTableData[j].getData().name != null && recTableData[j].getData().name != "") { var name = recTableData[j].getData().name; smsTxt = stringReplaceAll(smsTxt, "[*이름*]", name); orgSmsTxt = stringReplaceAll(orgSmsTxt, "[*이름*]", name);//광고, 선거 문자인 경우 상하단 문구 제거한 문자내용만 보여주도록 함. 치환문자 있으면 변환해서 보여줌 }/*else{ if(nmStatus){ alert("[*이름*] 치환 문자에 데이터가 없습니다. 받는사람 목록의 치환 데이터를 확인해 주세요."); return false; } }*/ if(typeof recTableData[j].getData().rep1 != 'undefined' && recTableData[j].getData().rep1 != null){ var rep1 = recTableData[j].getData().rep1; smsTxt = stringReplaceAll(smsTxt, "[*1*]", rep1); orgSmsTxt = stringReplaceAll(orgSmsTxt, "[*1*]", rep1); }/*else{ if(rep1Status){ alert("[*1*] 치환 문자에 데이터가 없습니다. 받는사람 목록의 치환 데이터를 확인해 주세요."); return false; } }*/ if(typeof recTableData[j].getData().rep2 != 'undefined' && recTableData[j].getData().rep2 != null){ var rep2 = recTableData[j].getData().rep2; smsTxt = stringReplaceAll(smsTxt, "[*2*]", rep2); orgSmsTxt = stringReplaceAll(orgSmsTxt, "[*2*]", rep2); }/*else{ if(rep2Status){ alert("[*2*] 치환 문자에 데이터가 없습니다. 받는사람 목록의 치환 데이터를 확인해 주세요."); return false; } }*/ if(typeof recTableData[j].getData().rep3 != 'undefined' && recTableData[j].getData().rep3 != null){ var rep3 = recTableData[j].getData().rep3; smsTxt = stringReplaceAll(smsTxt, "[*3*]", rep3); orgSmsTxt = stringReplaceAll(orgSmsTxt, "[*3*]", rep3); }/*else{ if(rep3Status){ alert("[*3*] 치환 문자에 데이터가 없습니다. 받는사람 목록의 치환 데이터를 확인해 주세요."); return false; } }*/ if(typeof recTableData[j].getData().rep4 != 'undefined' && recTableData[j].getData().rep4 != null){ var rep4 = recTableData[j].getData().rep4; smsTxt = stringReplaceAll(smsTxt, "[*4*]", rep4); orgSmsTxt = stringReplaceAll(orgSmsTxt, "[*4*]", rep4); }/*else{ if(rep4Status){ alert("[*4*] 치환 문자에 데이터가 없습니다. 받는사람 목록의 치환 데이터를 확인해 주세요."); return false; } }*/ var msgLen = conByteLeng(smsTxt); if(msgLen < 1){ }else if(msgLen > 2000){ alert("문자 내용은 2000byte를 넘을 수 없습니다."); return false; }else{ if(msgLen > 90){ msg_long++; console.log(evnRemainCash + " === " + evnLongPrice); if(evnRemainCash >= evnLongPrice && evnMsgCntSts == true){//이벤트 금액으로 보낼수 있으면 카운팅 evnRemainCash = evnRemainCash - evnLongPrice; evnPhoneNumCnt++; evnLongMsgCnt++; $("#evnPhoneNumCnt").val(evnPhoneNumCnt); $("#evnLongMsgCnt").val(evnLongMsgCnt); }else{//이벤트 금액으로 보낼수 없으면 카운팅 중지 evnMsgCntSts = false; } }else{ msg_short++; if(evnRemainCash >= evnShortPrice && evnMsgCntSts == true){//이벤트 금액으로 발송할 수 있으면 카운팅 evnRemainCash = evnRemainCash - evnShortPrice; evnPhoneNumCnt++; evnShortMsgCnt++; $("#evnPhoneNumCnt").val(evnPhoneNumCnt); $("#evnShortMsgCnt").val(evnShortMsgCnt); }else{//이벤트 금액으로 보낼수 없으면 카운티 중지 evnMsgCntSts = false; } } } replTotalPriceSum(msg_short, msg_long, totRows); //첫번째 수신자의 변환 텍스트 내용을 적용하여 미리보기 문자내용에 보여주자. if(j == 0){ //미리보기에 내용 입력해 주기 if(adverTxt.length > 0){ $('.realtime').text(orgSmsTxt); }else{ $('.realtime').text(smsTxt); } } //일괄변환문자 포함 여부 변경 //$('#txtReplYn').val("Y") } //변환후 문자 중에 장문이 1개 이상 있는 경우 문자 제목을 입력해 주기 /*var txtReplYn = $('#txtReplYn').val(); if(txtReplYn == 'Y' && (msg_long > 0 || imgCnt > 0 )){ //장문, 그림 문자가 포함되어 있는 경우 제목을 입력하도록 처리 $('#mmsSubject').attr("disabled", false); }else if(txtReplYn == 'Y' && msg_long < 1){ //일괄변환에 단문문자만 있는경우 제목 입력 안되도록 처리 $('#mmsSubject').val(""); $('#mmsSubject').attr("disabled", true); }*/ } } } //치환문자 replaceAll 기능 처리하는 함수 function stringReplaceAll(str, a, b){ return str.split(a).join(b); }