CustomerDetailForm.html 68 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826
  1. <!DOCTYPE html>
  2. <html lang="ko"
  3. xmlns:th="http://www.thymeleaf.org">
  4. <!--
  5. *******************************************************************************
  6. * @source : CustomerDetailForm.html
  7. * @desc : 회원 상세 팝업 Page
  8. *============================================================================
  9. * STYLE24
  10. * Copyright(C) 2021 TSIT, All rights reserved.
  11. *============================================================================
  12. * VER DATE AUTHOR DESCRIPTION
  13. * === =========== ========== =============================================
  14. * 1.0 2021.01.18 jsshin 최초 작성
  15. *******************************************************************************
  16. -->
  17. <div class="modalPopup" data-width="1820" data-height="750" id="customerDetailForm">
  18. <div class="panelStyle">
  19. <!-- TITLE -->
  20. <div class="panelTitle">
  21. <strong>회원상세</strong>
  22. <button type="button" class="close" onclick="uifnPopupClose('popupCustomerDetail');"><em class="fa fa-times"></em></button>
  23. </div>
  24. <!-- //TITLE -->
  25. <!-- CONTENT -->
  26. <div class="panelContent" >
  27. <table class="frmStyle" aria-describedby="회원정보">
  28. <colgroup>
  29. <col style="width:10%;"/>
  30. <col style="width:15%;"/>
  31. <col style="width:10%;"/>
  32. <col style="width:15%;"/>
  33. <col style="width:10%;"/>
  34. <col style="width:15%;"/>
  35. </colgroup>
  36. <tbody>
  37. <th>이름</th>
  38. <td>
  39. <span id="spanCustNm" name="spanCustNm"></span>
  40. <span id="managedRsnNm" name="managedRsnNm" class="infoTxt cRed h5"></span>
  41. </td>
  42. <th>아이디</th>
  43. <td>
  44. <span id="spanCustId" name="spanCustId"></span>
  45. <th:block th:if="${sessionInfo.userId == 'jsshin'}">
  46. <button type="button" id="btnLogin" class="btn btnRight btn-success btn-lg">Login</button>
  47. </th:block>
  48. </td>
  49. <th>가입사이트</th>
  50. <td>
  51. <span id="siteNm" name="siteNm"></span>
  52. </td>
  53. </tbody>
  54. </table>
  55. <!-- TABS SPACE -->
  56. <div class="tabs">
  57. <!-- TABS NAVI -->
  58. <div class="tabsNav">
  59. <ul>
  60. <li class="on"><a href="#tab1" onclick="fnSearchCustInfo();">기본정보</a></li>
  61. <li><a href="#tab2" onclick="fnSearchOrder();">주문내역</a></li>
  62. <li><a href="#tab3" onclick="fnCustSearchDelivery();">배송지정보</a></li>
  63. <li><a href="#tab4" onclick="fnSearchCoupon();">쿠폰내역</a></li>
  64. <li><a href="#tab5" onclick="fnSearchPoint();">포인트내역</a></li>
  65. <li><a href="#tab6" onclick="fnSearchGiftCard()">상품권내역</a></li>
  66. <li><a href="#tab7" onclick="fnSearchReview();">상품평내역</a></li>
  67. <li><a href="#tab8" onclick="fnSearchCounsel();">1:1문의내역</a></li>
  68. <li><a href="#tab9" onclick="fnSearchGoodsQna();">상품문의내역</a></li>
  69. <li><a href="#tab10" onclick="fnSearchContact();">회원접촉이력</a></li>
  70. <li><a href="#tab11" onclick="fnSearchChangeGrade();">회원등급변경이력</a></li>
  71. </ul>
  72. </div>
  73. <!-- //TABS NAVI -->
  74. <!-- TABS CONTENTS -->
  75. <ul class="tabsCont">
  76. <!-- TAB1 : 회원정보 -->
  77. <li class="tab on" id="tab1">
  78. <!-- TAB1 PANELSTYLE -->
  79. <div class="panelStyle">
  80. <form id="custInfoForm" name="custInfoForm" action="#" method="post">
  81. <input type="hidden" name="custNo" th:value="${custNo}"/>
  82. <h4>기본정보</h4>
  83. <table class="frmStyle">
  84. <colgroup>
  85. <col style="width:10%;"/>
  86. <col style="width:40%;"/>
  87. <col style="width:10%;"/>
  88. <col/>
  89. </colgroup>
  90. <tbody>
  91. <tr>
  92. <th class="dashR">회원구분<em class="required" title="필수"></em></th>
  93. <td class="dashR">
  94. <select id="custGb" name="custGb">
  95. <option th:if="${custGbList}" th:each="oneData, status : ${custGbList}" th:value="${oneData.cd}"
  96. th:text="${'[' + oneData.cd + '] '+oneData.cdNm}"></option>
  97. </select>
  98. </td>
  99. <th class="dashR">회원등급<em class="required" title="필수"></em></th>
  100. <td class="dashR">
  101. <select id="custGrade" name="custGrade">
  102. <option th:if="${custGradeList}" th:each="oneData, status : ${custGradeList}" th:value="${oneData.cd}"
  103. th:text="${'[' + oneData.cd + '] '+oneData.cdNm}"></option>
  104. </select>
  105. </td>
  106. </tr>
  107. <tr>
  108. <th class="dashR">관리대상</th>
  109. <td class="dashR">
  110. <select id="managedRsn" name="managedRsn">
  111. <option value="">일반</option>
  112. <option th:if="${managedRsnList}" th:each="oneData, status : ${managedRsnList}" th:value="${oneData.cd}"
  113. th:text="${'[' + oneData.cd + '] '+oneData.cdNm}"></option>
  114. </select>
  115. <span class="infoTxt cRed h5" id="managedRsnDp" name="managedRsnDp"></span>
  116. </td>
  117. <th class="dashR">관리대상 지정 날짜</th>
  118. <td class="dashR" id="managedDt" name="managedDt">
  119. </td>
  120. </tr>
  121. <tr>
  122. <th class="dashR">관리대상 지정 사유</th>
  123. <td class="dashR" colspan="3">
  124. <input type="text" id="managedDtlRsn" name="managedDtlRsn" class="w600" />
  125. </td>
  126. </tr>
  127. <tr>
  128. <th class="dashR">비밀번호</th>
  129. <td class="dashR">
  130. *******
  131. <button type="button" id="btnResetPassword" class="btn btn-info btn-lg">초기화</button>
  132. <span class="infoTxt cBlue">
  133. <i class="fa fa-info-circle"></i>회원에게 임시비밀번호를 발송합니다. (이메일, 알림톡)
  134. </span>
  135. </td>
  136. <th class="dashR">내외국인</th>
  137. <td class="dashR" id="foreignerYn" name="foreignerYn"></td>
  138. </tr>
  139. <tr>
  140. <th class="dashR">생년월일</th>
  141. <td class="dashR">
  142. <input type="text" id="birthYmd" name="birthYmd" class="schDate w100" data-valid-name="생년월일"/>
  143. </td>
  144. <th class="dashR">성별</th>
  145. <td class="dashR" id="sexGb" name="sexGb"></td>
  146. </tr>
  147. <tr>
  148. <th class="dashR">자택주소</th>
  149. <td class="dashR" colspan="3">
  150. <input type="text" id="homeZipcode" name="homeZipcode" class="w100" readonly="readonly"/>
  151. <button type="button" class="btn btn-info btn-lg" onclick="fnOpenDaumAddr('custInfoForm');">우편번호찾기</button>
  152. <br/>
  153. <input type="text" id="homeBaseAddr" name="homeBaseAddr" class="w300" readonly="readonly"/>
  154. <input type="text" id="homeDtlAddr" name="homeDtlAddr" class="w300"/>
  155. </td>
  156. </tr>
  157. <tr>
  158. <th class="dashR">휴대전화번호<em class="required" title="필수"></em></th>
  159. <td class="dashR">
  160. <input type="hidden" name="cellPhnno"/>
  161. <input type="text" name="maskingCellPhnno" class="w130" readonly="readonly"/>
  162. <button type="button" id="btnCustSendLms" class="btn btn-info btn-lg">LMS전송</button>
  163. <button type="button" id="btnCustCrtfd" class="btn btn-info btn-lg">번호변경</button>
  164. <button type="button" class="btn btn-info btn-lg" id="btnInitializeCI">CI초기화</button>
  165. </td>
  166. <th class="dashR">SMS수신여부<em class="required" title="필수"></em></th>
  167. <td class="dashR">
  168. <label class="rdoBtn"><input type="radio" name="smsAgreeYn" value="Y"/>수신</label>
  169. <label class="rdoBtn"><input type="radio" name="smsAgreeYn" value="N"/>미수신</label>
  170. </td>
  171. </tr>
  172. <tr>
  173. <th class="dashR">이메일<em class="required" title="필수"></em></th>
  174. <td class="dashR">
  175. <input type="hidden" name="emailModifyYn"/>
  176. <input type="hidden" name="maskingEmail"/>
  177. <input type="hidden" name="orgEmail"/>
  178. <input type="hidden" name="email" data-valid-name="이메일"/>
  179. <input type="text" id="emailId" name="emailId" class="w200" maxlength="30"/>
  180. @
  181. <input type="text" id="emailDomain" name="emailDomain" class="w150" maxlength="20"/>
  182. <select id="emailDomainList" name="emailDomainList">
  183. <option value="">선택하세요</option>
  184. <option th:if="${emailDomainList}" th:each="oneData, status : ${emailDomainList}" th:value="${oneData.cd}"
  185. th:text="|${oneData.cdNm}|"></option>
  186. </select>
  187. <button type="button" id="btnCustSendEmail" class="btn btn-info btn-lg" >이메일발송</button>
  188. </td>
  189. <th class="dashR">EMAIL수신여부<em class="required" title="필수"></em></th>
  190. <td class="dashR">
  191. <label class="rdoBtn"><input type="radio" name="emailAgreeYn" value="Y"/>수신</label>
  192. <label class="rdoBtn"><input type="radio" name="emailAgreeYn" value="N"/>미수신</label>
  193. </td>
  194. </tr>
  195. <tr>
  196. <th class="dashR">환불계좌</th>
  197. <td class="dashR" colspan="3">
  198. <div id="divRefundAccountTxt" style="display: none;">
  199. <span id="refundAccount"></span>
  200. <button type="button" class="btn btn-info btn-lg" id="btnDeleteRefundAccount">등록계좌삭제</button>
  201. </div>
  202. <div id="divRefundAccountInput" style="display: none;">
  203. <select name="bankCd">
  204. <option value="">[은행 선택]</option>
  205. <option th:if="${bankList}" th:each="oneData, status : ${bankList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] '+oneData.cdNm}"></option>
  206. </select>
  207. <input type="text" name="accountNo" class="w200" placeholder="계좌번호" maxlength="20" data-valid-type="numeric"/>
  208. <input type="text" name="accountNm" class="w100" placeholder="예금주" maxlength="10"/>
  209. <button type="button" class="btn btn-info btn-lg" id="btnCertifyRefundAccount">계좌인증</button>
  210. <button type="button" class="btn btn-info btn-lg" id="btnRegisterRefundAccount">계좌등록</button>
  211. </div>
  212. </td>
  213. </tr>
  214. <tr>
  215. <th class="dashR">가입일시</th>
  216. <td class="dashR" id="joinDt" name="joinDt"></td>
  217. <th class="dashR">APP수신여부<em class="required" title="필수"></em></th>
  218. <td class="dashR">
  219. <label class="rdoBtn"><input type="radio" name="appAgreeYn" value="Y"/>수신</label>
  220. <label class="rdoBtn"><input type="radio" name="appAgreeYn" value="N"/>미수신</label>
  221. </td>
  222. </tr>
  223. <tr>
  224. <th class="dashR">최종로그인일시</th>
  225. <td class="dashR" id="loginLdt" name="loginLdt"></td>
  226. <th class="dashR">마케팅수신여부<em class="required" title="필수"></em></th>
  227. <td class="dashR">
  228. <label class="rdoBtn"><input type="radio" name="mkAgreeYn" value="Y"/>수신</label>
  229. <label class="rdoBtn"><input type="radio" name="mkAgreeYn" value="N"/>미수신</label>
  230. </td>
  231. </tr>
  232. <tr>
  233. <th class="dashR">SNS가입유형</th>
  234. <td class="dashR" id="snsType" name="snsType"></td>
  235. <th class="dashR">탈퇴여부</th>
  236. <td class="dashR">
  237. <spna id="secedeRsnYn" name="secedeRsnYn" ></spna>
  238. <button type="button" id="btnCustSecede" class="btn btn-danger btn-lg marL5" style="display: none">
  239. 회원탈퇴
  240. </button>
  241. </td>
  242. </tr>
  243. </tbody>
  244. </table>
  245. <ul class="panelBar">
  246. <li class="right">
  247. <button type="button" id="btnCustInfoSave" class="btn btn-success btn-lg">저장</button>
  248. </li>
  249. </ul>
  250. </form>
  251. </div>
  252. <!-- //TAB1 PANELSTYLE -->
  253. </li>
  254. <!-- //TAB1 : 회원정보 -->
  255. <!-- TAB2 : 주문내역 -->
  256. <li id="tab2" class="tab">
  257. <!-- TAB2 PANELSTYLE -->
  258. <div class="panelStyle">
  259. <form id="custOrderListFrom" name="custOrderListFrom" action="#" th:action="@{'/customer/order/list'}" method="post">
  260. <input type="hidden" name="custNo" th:value="${custNo}"/>
  261. <h4>주문내역</h4>
  262. <ul class="panelBar">
  263. <li class="right">
  264. 검색결과 : <strong><span id="gridOrderRowTotalCount">0</span> 건</strong>&nbsp;
  265. 쪽번호 <span id="ordPgNo">0</span>/ <strong id="ordEndPgNo">0</strong>&nbsp;&nbsp;
  266. <select name="pageSize">
  267. <option value="50" selected="selected">50개씩 보기</option>
  268. <option value="100">100개씩 보기</option>
  269. <option value="500">500개씩 보기</option>
  270. <option value="1000">1000개씩 보기</option>
  271. </select>
  272. <input type="hidden" name="pageNo" id="pageNo" value ="1"/>
  273. </li>
  274. </ul>
  275. <div id="custOrderList" class="ag-theme-balham" style="width: 100%; height: 510px;"></div>
  276. <ul class="panelBar">
  277. <li class="center">
  278. <div class="tablePaging" id="custOrderListPagination"></div>
  279. </li>
  280. </ul>
  281. </form>
  282. </div>
  283. <!-- //TAB2 PANELSTYLE -->
  284. </li>
  285. <!-- //TAB2 : 주문내역 -->
  286. <!-- TAB3 : 배송지정보 -->
  287. <li id="tab3" class="tab">
  288. <!-- TAB3 PANELSTYLE -->
  289. <div class="panelStyle">
  290. <form id="custAddrForm" name="custAddrForm" action="#" method="post">
  291. <input type="hidden" name="custDelvAddrSq"/>
  292. <input type="hidden" name="custNo" th:value="${custNo}"/>
  293. <h4>배송지정보</h4>
  294. <div id="custAddrList" class="ag-theme-balham" style="width: 100%; height: 300px;" ></div>
  295. <table class="frmStyle">
  296. <colgroup>
  297. <col style="width:5%;"/>
  298. <col style="width:25%;"/>
  299. <col style="width:5%;"/>
  300. <col style="width:25%;"/>
  301. <col style="width:5%;"/>
  302. <col style="width:25%;"/>
  303. <col/>
  304. </colgroup>
  305. <tbody>
  306. <tr>
  307. <th>배송지명<em class="required" title="필수"></em></th>
  308. <td>
  309. <input type="text" class="w200" name="delvAddrNm" maxlength="30" required="required" data-valid-name="배송지명"/>
  310. <label class="chkBox">
  311. <input type="checkbox" name="defaultYn" value="Y"/>기본
  312. </label>
  313. </td>
  314. <th>수령인<em class="required" title="필수"></em></th>
  315. <td>
  316. <input type="text" class="w200" name="recipNm" maxlength="10" required="required" data-valid-name="수령인"/>
  317. </td>
  318. <th>삭제여부</th>
  319. <td>
  320. <label class="chkBox">
  321. <input type="checkbox" name="delYn" value="Y"/>
  322. </label>
  323. </td>
  324. </tr>
  325. <tr>
  326. <th>전화번호</th>
  327. <td >
  328. <input type="hidden" id="recipTelno" name="recipTelno"/>
  329. <select class="w100" id="telFirstNo" name="telFirstNo">
  330. <option value="">선택</option>
  331. <option th:if="${nationalNumberList}" th:each="oneData, status : ${nationalNumberList}"
  332. th:value="${oneData.cd}" th:text="|${oneData.cd}|"></option>
  333. </select> -
  334. <input type="text" class="w100" name="telMiddleNo" maxlength="4" data-valid-type="numeric"
  335. data-valid-name="전화번호"/> -
  336. <input type="text" class="w100" name="telLastNo" maxlength="4" data-valid-type="numeric"
  337. data-valid-name="전화번호"/>
  338. </td>
  339. <th>휴대전화번호<em class="required" title="필수"></em></th>
  340. <td colspan="4">
  341. <input type="hidden" id="recipPhnno" name="recipPhnno"/>
  342. <select class="w100" id="recipFirstNo" name="recipFirstNo">
  343. <option value="">선택</option>
  344. <option th:if="${nationalHpNumberList}" th:each="oneData, status : ${nationalHpNumberList}"
  345. th:value="${oneData.cd}" th:text="|${oneData.cd}|"></option>
  346. </select> -
  347. <input type="text" class="w100" id="recipMiddleNo" name="recipMiddleNo" maxlength="4" required="required" data-valid-type="numeric"
  348. data-valid-name="휴대전화번호"/> -
  349. <input type="text" class="w100" id="recipLastNo" name="recipLastNo" maxlength="4" required="required" data-valid-type="numeric"
  350. data-valid-name="휴대전화번호"/>
  351. </td>
  352. </tr>
  353. <tr>
  354. <th>주소<em class="required" title="필수"></em></th>
  355. <td colspan="5">
  356. <input type="text" id="recipZipcode" name="recipZipcode" class="w100" maxlength="10" required="required" data-valid-name="주소"/>
  357. <button type="button" class="btn btn-info btn-lg" onclick="fnOpenDaumAddr('custAddrForm');">우편번호찾기</button>
  358. <br/>
  359. <input type="text" id="recipBaseAddr" name="recipBaseAddr" class="w300" maxlength="50" required="required" data-valid-name="주소"/>
  360. <input type="text" id="recipDtlAddr" name="recipDtlAddr" class="w300" maxlength="30" required="required" data-valid-name="상세주소"/>
  361. </td>
  362. </tr>
  363. </tbody>
  364. </table>
  365. <ul class="panelBar">
  366. <li class="right">
  367. <button type="button" class="btn btn-info btn-lg" id="btnCustAddrNew">신규</button>
  368. <button type="button" class="btn btn-success btn-lg" id="btnCustAddrSave">저장</button>
  369. </li>
  370. </ul>
  371. </form>
  372. </div>
  373. <!-- //TAB3 PANELSTYLE -->
  374. </li>
  375. <!-- //TAB3 : 배송지정보 -->
  376. <!-- TAB4 : 쿠폰 내역 -->
  377. <li id="tab4" class="tab">
  378. <!-- TAB4 PANELSTYLE -->
  379. <div class="panelStyle">
  380. <h4>쿠폰 내역</h4>
  381. <div id="custCouponList" class="ag-theme-balham" style="width: 100%; height: 510px;" ></div>
  382. <ul class="panelBar">
  383. <li class="right">
  384. <button type="button" id="btnCustCouponCreate" class="btn btn-info btn-lg" >쿠폰발급</button>
  385. </li>
  386. </ul>
  387. </div>
  388. <!-- //TAB4 PANELSTYLE -->
  389. </li>
  390. <!-- //TAB4 : 쿠폰 내역 -->
  391. <!-- TAB5 : 포인트 내역 -->
  392. <li id="tab5" class="tab">
  393. <!-- TAB5 PANELSTYLE -->
  394. <div class="panelStyle">
  395. <form id="custPointForm" name="custPointForm" action="#" method="post">
  396. <h4>포인트 내역</h4>
  397. <table class="tableStyle">
  398. <colgroup>
  399. <col style="width:15%;"/>
  400. <col style="width:15%;"/>
  401. <col style="width:15%;"/>
  402. <col style="width:20%;"/>
  403. <col style="width:20%;"/>
  404. <col style="width:25%;"/>
  405. </colgroup>
  406. <tbody>
  407. <tr>
  408. <th>가용포인트</th>
  409. <th>누적포인트</th>
  410. <th>사용포인트</th>
  411. <th>소멸포인트</th>
  412. <th>적립예정포인트</th>
  413. <th>소멸예정포인트(30일)</th>
  414. </tr>
  415. <tr>
  416. <td name="availPntAmt">0 P</td>
  417. <td name="accumPntAmt">0 P</td>
  418. <td name="usePntAmt">0 P</td>
  419. <td name="expirePntAmt">0 P</td>
  420. <td name="expectedPntAmt">0 P</td>
  421. <td name="expectedExpirePntAmt">0 P</td>
  422. </tr>
  423. </tbody>
  424. </table>
  425. <br/>
  426. <div id="custPointList" class="ag-theme-balham" style="width: 100%; height: 420px;"></div>
  427. <ul class="panelBar">
  428. <li class="right">
  429. <button type="button" id="btnCustPointCreate" class="btn btn-info btn-lg">포인트부여</button>
  430. </li>
  431. </ul>
  432. </form>
  433. </div>
  434. <!-- //TAB5 PANELSTYLE -->
  435. </li>
  436. <!-- //TAB5 : 포인트 내역 -->
  437. <!-- TAB6 : 상품권 내역 -->
  438. <li id="tab6" class="tab">
  439. <!-- TAB6 PANELSTYLE -->
  440. <div class="panelStyle">
  441. <h4>상품권 내역</h4>
  442. <div id="custGiftCardList" class="ag-theme-balham" style="width: 100%; height: 510px;"></div>
  443. </div>
  444. <!-- //TAB6 PANELSTYLE -->
  445. </li>
  446. <!-- //TAB6 : 상품권 내역 -->
  447. <!-- TAB7 : 상품평 -->
  448. <li id="tab7" class="tab">
  449. <!-- TAB7 PANELSTYLE -->
  450. <div class="panelStyle">
  451. <h4>상품평 내역</h4>
  452. <div id="custReviewList" class="ag-theme-balham" style="width: 100%; height: 510px;"></div>
  453. </div>
  454. <!-- //TAB7 PANELSTYLE -->
  455. </li>
  456. <!-- //TAB7 : 상품평 내역 -->
  457. <!-- TAB8 : 1:1문의 내역 -->
  458. <li id="tab8" class="tab">
  459. <!-- TAB8 PANELSTYLE -->
  460. <div class="panelStyle">
  461. <h4>1:1문의 내역</h4>
  462. <div id="custCounselList" class="ag-theme-balham" style="width: 100%; height: 510px;"></div>
  463. </div>
  464. <!-- //TAB8 PANELSTYLE -->
  465. </li>
  466. <!-- //TAB8 : 1:1문의 내역 -->
  467. <!-- TAB9 : 상품문의 내역 -->
  468. <li id="tab9" class="tab">
  469. <!-- TAB9 PANELSTYLE -->
  470. <div class="panelStyle">
  471. <h4>상품문의 내역</h4>
  472. <div id="custGoodsQnaList" class="ag-theme-balham" style="width: 100%; height: 510px;"></div>
  473. </div>
  474. <!-- //TAB9 PANELSTYLE -->
  475. </li>
  476. <!-- //TAB9 : 상품문의 내역 -->
  477. <!-- TAB10 : 회원접촉이력 -->
  478. <li id="tab10" class="tab">
  479. <!-- TAB10 PANELSTYLE -->
  480. <div class="panelStyle">
  481. <form id="custContactHstForm" name="custContactHstForm" action="#" method="post">
  482. <input type="hidden" name="custNo" th:value="${custNo}"/>
  483. <h4>회원접촉이력</h4>
  484. <table class="frmStyle">
  485. <colgroup>
  486. <col style="width:3%;"/>
  487. <col style="width:7%;"/>
  488. <col style="width:6%;"/>
  489. <col style="width:5%;"/>
  490. <col style="width:6%;"/>
  491. <col style="width:29%;"/>
  492. <col/>
  493. </colgroup>
  494. <tbody>
  495. <tr>
  496. <th>접촉유형<em class="required" title="필수"></em></th>
  497. <td>
  498. <select name="contactType" class="w150" required="required" data-valid-type="select" data-valid-name="접촉유형">
  499. <option value="">[선택]</option>
  500. <option th:if="${contactTypeList}" th:each="oneData, status : ${contactTypeList}" th:value="${oneData.cd}"
  501. th:text="${'[' + oneData.cd + '] '+oneData.cdNm}"></option>
  502. </select>
  503. </td>
  504. <th>접촉방법<em class="required" title="필수"></em></th>
  505. <td>
  506. <select name="contactMethod" class="w150" required="required" data-valid-type="select" data-valid-name="접촉방법">
  507. <option value="">[선택]</option>
  508. <option th:if="${contactMethodList}" th:each="oneData, status : ${contactMethodList}" th:value="${oneData.cd}"
  509. th:text="${'[' + oneData.cd + '] '+oneData.cdNm}"></option>
  510. </select>
  511. </td>
  512. <th>내용<em class="required" title="필수"></em></th>
  513. <td>
  514. <textarea class="textareaR2 w600" name="contactContents" required="required" data-valid-name="내용"></textarea>
  515. <button type="button" id="btnSaveContact" class="btn btn-success btn-lg">저장</button>
  516. </td>
  517. </tr>
  518. </tbody>
  519. </table>
  520. <br/>
  521. <div id="custContactList" class="ag-theme-balham" style="width: 100%; height: 420px;"></div>
  522. </form>
  523. </div>
  524. <!-- //TAB10 PANELSTYLE -->
  525. </li>
  526. <!-- //TAB10 : 회원접촉이력 -->
  527. <!-- TAB11 : 등급변경이력 -->
  528. <li id="tab11" class="tab">
  529. <!-- TAB11 PANELSTYLE -->
  530. <div class="panelStyle">
  531. <h4>등급변경이력</h4>
  532. <div id="custGradeList" class="ag-theme-balham" style="width: 100%; height: 510px;"></div>
  533. </div>
  534. <!-- //TAB11 PANELSTYLE -->
  535. </li>
  536. <!-- //TAB11 : 등급변경이력 -->
  537. </ul>
  538. <!-- //TABS CONTENTS -->
  539. </div>
  540. <!-- // TABS SPACE -->
  541. </div>
  542. <!-- //CONTENT -->
  543. </div>
  544. </div>
  545. <script type="text/javascript" th:src="@{'/ux/plugins/gaga/gaga.paging.js?v=' + ${#calendars.format(#calendars.createNow(), 'yyyyMMddHHmmss')}}" src="/ux/plugins/gaga/gaga.paging.js"></script>
  546. <script th:inline="javascript">
  547. /*<![CDATA[*/
  548. const custNo = [[${custNo}]]; //고객번호
  549. const siteList = gagajf.convertToArray([[${siteList}]]); //사이트목록
  550. //const custGbList = gagajf.convertToArray([[${custGbList}]]); //회원구분
  551. const custGradeList = gagajf.convertToArray([[${custGradeList}]]); //회원등급
  552. //const managedRsnList = gagajf.convertToArray([[${managedRsnList}]]); //관리대상
  553. const mallGbList = gagajf.convertToArray([[${mallGbList}]]); //몰구분
  554. const orderStatList = gagajf.convertToArray([[${orderStatList}]]); //주문상태
  555. const orderDtlStatList = gagajf.convertToArray([[${orderDtlStatList}]]); //주문상세상태
  556. const cpnType = gagajf.convertToArray([[${cpnType}]]); //쿠폰유형
  557. //const dcWayList = gagajf.convertToArray([[${dcWayList}]]); //쿠폰할인방식
  558. const pubReasonList = gagajf.convertToArray([[${pubReasonList}]]); //쿠폰발행사유
  559. const pntOccurGbList = gagajf.convertToArray([[${pntOccurGbList}]]); //포인트반영구분
  560. const pntUploadStatList = gagajf.convertToArray([[${pntUploadStatList}]]); //포인트반영상태
  561. const reviewPntStatList = gagajf.convertToArray([[${reviewPntStatList}]]); //상품평포인트반영상태
  562. const giftCardOccurGbList = gagajf.convertToArray([[${giftCardOccurGbList}]]); //상품권유형
  563. const counselClsfList = gagajf.convertToArray([[${counselClsfList}]]); //상담분류
  564. const contactTypeList = gagajf.convertToArray([[${contactTypeList}]]); //회원접촉유형
  565. const contactMethodList = gagajf.convertToArray([[${contactMethodList}]]); //회원접촉방법
  566. const genderGbList = gagajf.convertToArray([[${genderGbList}]]); //성별
  567. let orgData;
  568. //구매내역 그리드
  569. const columnOrderDefs = [
  570. {
  571. headerName: "주문번호", field: "ordNo", width: 100, cellClass: 'text-center',
  572. cellRenderer: function (params) {
  573. return '<a href="javascript:void(0);">' + params.value + '</a>';
  574. }
  575. },
  576. {headerName: "주문상세번호", field: "ordDtlNo", width: 100, cellClass: 'text-center'},
  577. {
  578. headerName: "몰구분", field: "mallGb", width: 100, cellClass: 'text-center',
  579. valueFormatter: function (params) {
  580. return gagaAgGrid.lookupValue(mallGbList, params.value);
  581. }
  582. },
  583. {
  584. headerName: "결제일시", field: "payDt", width: 150, cellClass: 'text-center',
  585. cellRenderer: function (params) {
  586. return gagaAgGrid.toDateTimeFormat(params.value);
  587. }
  588. },
  589. {
  590. headerName: "배송완료일시", field: "delvEddt", width: 150, cellClass: 'text-center',
  591. cellRenderer: function (params) {
  592. return gagaAgGrid.toDateTimeFormat(params.value);
  593. }
  594. },
  595. {headerName: "주문자전화번호", field: "ordTelno", width: 120, cellClass: 'text-center'},
  596. {headerName: "주문자휴대폰", field: "ordPhnno", width: 130, cellClass: 'text-center'},
  597. {
  598. headerName: "주문상세상태", field: "ordDtlStat", width: 130, cellClass: 'text-center',
  599. valueFormatter: function (params) {
  600. return gagaAgGrid.lookupValue(orderDtlStatList, params.value);
  601. }
  602. },
  603. {headerName: "수령인", field: "recipNm", width: 100, cellClass: 'text-center'},
  604. {
  605. headerName: "상품코드", field: "goodsCd", width: 150, cellClass: 'text-center',
  606. cellRenderer: function (params) {
  607. return '<a href="javascript:void(0);">' + params.value + '</a>';
  608. }
  609. },
  610. {headerName: "색상", field: "optCd1", width: 100, cellClass: 'text-center'},
  611. {headerName: "사이즈", field: "optCd2", width: 100, cellClass: 'text-center'},
  612. {headerName: "상품명", field: "goodsNm", width: 250, cellClass: 'text-left'},
  613. {headerName: "주문수량", field: "ordQty", width: 100, cellClass: 'text-center'},
  614. {headerName: "판매상품가격", field: "currPrice", width: 100, cellClass: 'text-center'},
  615. ];
  616. // 1:1문의 내역 그리드
  617. const columnCounselDefs = [
  618. {
  619. headerName: "상담분류", field: "counselClsf", width: 150, cellClass: 'text-center',
  620. valueFormatter: function (params) {
  621. return gagaAgGrid.lookupValue(counselClsfList, params.value);
  622. }
  623. },
  624. {
  625. headerName: "질문제목", field: "questTitle", width: 300, cellClass: 'text-center',
  626. cellRenderer: function (params) {
  627. return '<a href="javascript:void(0);">' + params.value + '</a>';
  628. }
  629. },
  630. {headerName: "비밀글여부", field: "secretYn", width: 100, cellClass: 'text-center'},
  631. {
  632. headerName: "등록일시", field: "questDt", width: 150, cellClass: 'text-center',
  633. cellRenderer: function (params) {
  634. return gagaAgGrid.toDateTimeFormat(params.value);
  635. }
  636. },
  637. {
  638. headerName: "답변일시", field: "ansDt", width: 150, cellClass: 'text-center',
  639. cellRenderer: function (params) {
  640. return gagaAgGrid.toDateTimeFormat(params.value);
  641. }
  642. },
  643. {headerName: "확인자", field: "ansNm", width: 100, cellClass: 'text-center'}
  644. ];
  645. // 상품문의 내역 그리드
  646. const columnGoodsQnaDefs = [
  647. {headerName: "상품코드", field: "relGoodsCd", width: 200, cellClass: 'text-center'},
  648. {
  649. headerName: "질문제목", field: "questTitle", width: 300, cellClass: 'text-center',
  650. cellRenderer: function (params) {
  651. return '<a href="javascript:void(0);">' + params.value + '</a>';
  652. }
  653. },
  654. {headerName: "비밀글여부", field: "secretYn", width: 100, cellClass: 'text-center'},
  655. {
  656. headerName: "등록일시", field: "questDt", width: 150, cellClass: 'text-center',
  657. cellRenderer: function (params) {
  658. return gagaAgGrid.toDateTimeFormat(params.value);
  659. }
  660. },
  661. {
  662. headerName: "답변일시", field: "ansDt", width: 150, cellClass: 'text-center',
  663. cellRenderer: function (params) {
  664. return gagaAgGrid.toDateTimeFormat(params.value);
  665. }
  666. },
  667. {headerName: "확인자", field: "ansNm", width: 100, cellClass: 'text-center'}
  668. ];
  669. //쿠폰내역 그리드
  670. const columnCouponDefs = [
  671. // {width: 40, minWidth: 40, cellClass: 'text-center', pinned: 'left', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
  672. {headerName: "회원쿠폰SQ", field: "custCpnSq", width: 100, cellClass: 'text-center', hide: true},
  673. {headerName: "쿠폰ID", field: "cpnId", width: 100, cellClass: 'text-center'},
  674. {headerName: "쿠폰명", field: "cpnNm", width: 300, cellClass: 'text-center'
  675. , cellRenderer: function (params) {
  676. return "<a href=\"javascript:void(0);\" onclick=\"cfnCouponCreatePopup('U','" + params.data.cpnId + "');\">" + params.value + "</a>";
  677. }
  678. },
  679. {
  680. headerName: "유효기간 시작일시", field: "availStdt", width: 150, cellClass: 'text-center',
  681. cellRenderer: function (params) {
  682. return gagaAgGrid.toDateTimeFormat(params.value);
  683. }
  684. },
  685. {
  686. headerName: "유효기간 종료일시", field: "availEddt", width: 150, cellClass: 'text-center',
  687. cellRenderer: function (params) {
  688. return gagaAgGrid.toDateTimeFormat(params.value);
  689. }
  690. },
  691. {headerName: "주문번호", field: "ordNo", width: 130, cellClass: 'text-center'},
  692. {
  693. headerName: "사용일시", field: "usedDt", width: 100, cellClass: 'text-center',
  694. cellRenderer: function (params) {
  695. return gagaAgGrid.toDateTimeFormat(params.value);
  696. }
  697. },
  698. {
  699. headerName: "쿠폰발행 사유", field: "pubReason", width: 200, cellClass: 'text-center',
  700. valueFormatter: function (params) {
  701. return gagaAgGrid.lookupValue(pubReasonList, params.value);
  702. }
  703. },
  704. {headerName: "쿠폰발행 상세사유", field: "pubReasonDtl", width: 300, cellClass: 'text-center'},
  705. {headerName: "만료알림발송여부", field: "endAlimSendYn", width: 150, cellClass: 'text-center'},
  706. {headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
  707. {
  708. headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center',
  709. cellRenderer: function (params) {
  710. return gagaAgGrid.toDateTimeFormat(params.value);
  711. }
  712. }
  713. ];
  714. //포인트내역 그리드
  715. const columnPointDefs = [
  716. {
  717. headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center',
  718. cellRenderer: function (params) {
  719. return gagaAgGrid.toDateTimeFormat(params.value);
  720. }
  721. },
  722. {
  723. headerName: "반영일시", field: "pntUploadDt", width: 150, cellClass: 'text-center',
  724. cellRenderer: function (params) {
  725. return gagaAgGrid.toDateTimeFormat(params.value);
  726. }
  727. },
  728. {headerName: "주문번호", field: "ordNo", width: 100, cellClass: 'text-center'},
  729. {
  730. headerName: "반영상태", field: "pntUploadStat", width: 100, cellClass: 'text-center',
  731. valueFormatter: function (params) { return gagaAgGrid.lookupValue(pntUploadStatList, params.value); }
  732. },
  733. {
  734. headerName: "포인트", field: "pntAmt", width: 100, cellClass: 'text-center',
  735. cellRenderer: function (params) {
  736. return !gagajf.isNull(params.value) ? params.value.addComma() : '0';
  737. }
  738. },
  739. {
  740. headerName: "포인트사유", field: "occurGb", width: 150, cellClass: 'text-center',
  741. valueFormatter: function (params) {
  742. return gagaAgGrid.lookupValue(pntOccurGbList, params.value);
  743. }
  744. },
  745. {headerName: "포인트상세사유", field: "occurDtlDesc", width: 300, cellClass: 'text-center'},
  746. {
  747. headerName: "만료예정일시", field: "expBeDt", width: 150, cellClass: 'text-center',
  748. cellRenderer: function (params) {
  749. return params.data.pntAmt > 0 ? gagaAgGrid.toDateTimeFormat(params.value) : gagaAgGrid.toDateTimeFormat(params.data.pntUploadDt);
  750. }
  751. },
  752. {
  753. headerName: "만료완료일시", field: "expCmpDt", width: 150, cellClass: 'text-center',
  754. cellRenderer: function (params) {
  755. return gagaAgGrid.toDateTimeFormat(params.value);
  756. }
  757. },
  758. {headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'}
  759. ];
  760. //상품권내역 그리드
  761. const columnGiftCardDefs = [
  762. {
  763. headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center',
  764. cellRenderer: function (params) {
  765. return gagaAgGrid.toDateTimeFormat(params.value);
  766. }
  767. },
  768. {headerName: "주문번호", field: "ordNo", width: 100, cellClass: 'text-center'},
  769. {
  770. headerName: "금액", field: "gfcdAmt", width: 100, cellClass: 'text-center',
  771. cellRenderer: function (params) {
  772. return !gagajf.isNull(params.value) ? params.value.addComma() : '0';
  773. }
  774. },
  775. {
  776. headerName: "발생구분", field: "occurGb", width: 150, cellClass: 'text-center',
  777. valueFormatter: function (params) { return gagaAgGrid.lookupValue(giftCardOccurGbList, params.value); }
  778. },
  779. {
  780. headerName: "발생상세설명", field: "occurDtlDesc", width: 300, cellClass: 'text-center',
  781. valueFormatter: function (params) {
  782. return gagaAgGrid.lookupValue(pntOccurGbList, params.value);
  783. }
  784. },
  785. {headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'}
  786. ];
  787. //상품평 그리드
  788. const columnReviewDefs = [
  789. {headerName: "상품코드", field: "goodsCd", width: 100, cellClass: 'text-center'},
  790. {
  791. headerName: "내용", field: "reviewContent", width: 300, cellClass: 'text-center',
  792. cellRenderer: function (params) {
  793. return !gagajf.isNull(params.value) ? '<a href="javascript:void(0);">' + params.value + '</a>' : '';
  794. }
  795. },
  796. {headerName: "만족도", field: "score", width: 100, cellClass: 'text-center'},
  797. {
  798. headerName: "작성일시", field: "regDt", width: 150, cellClass: 'text-center',
  799. cellRenderer: function (params) {
  800. return gagaAgGrid.toDateTimeFormat(params.value);
  801. }
  802. },
  803. {
  804. headerName: "지급일시", field: "confirmDt", width: 150, cellClass: 'text-center',
  805. cellRenderer: function (params) {
  806. return gagaAgGrid.toDateTimeFormat(params.value);
  807. }
  808. },
  809. {headerName: "지급자", field: "confirmUnm", width: 130, cellClass: 'text-center'},
  810. {headerName: "게시여부", field: "dispYn", width: 100, cellClass: 'text-center'},
  811. {
  812. headerName: "지급예정포인트", field: "giveDuePnt", width: 120, cellClass: 'text-center',
  813. cellRenderer: function (params) {
  814. return !gagajf.isNull(params.value) ? params.value.addComma() : '0';
  815. }
  816. },
  817. {
  818. headerName: "포인트지급상태", field: "pntGiveStat", width: 120, cellClass: 'text-center',
  819. valueFormatter: function (params) {
  820. return gagaAgGrid.lookupValue(reviewPntStatList, params.value);
  821. }
  822. }
  823. ];
  824. //등급변경 그리드
  825. const columnGradeDefs = [
  826. {headerName: "적용연월일", field: "applyYmd", width: 150, cellClass: 'text-center'},
  827. {headerName: "고객ID", field: "custId", width: 100, cellClass: 'text-center'},
  828. {
  829. headerName: "이전회원등급", field: "gradeBcd", width: 100, cellClass: 'text-center',
  830. valueFormatter: function (params) {
  831. return gagaAgGrid.lookupValue(custGradeList, params.value);
  832. }
  833. },
  834. {
  835. headerName: "변경회원등급", field: "gradeAcd", width: 100, cellClass: 'text-center',
  836. valueFormatter: function (params) {
  837. return gagaAgGrid.lookupValue(custGradeList, params.value);
  838. }
  839. },
  840. {
  841. headerName: "3개월간 총 주문건수", field: "ordCnt", width: 150, cellClass: 'text-center',
  842. cellRenderer: function (params) {
  843. return !gagajf.isNull(params.value) ? params.value.addComma() : '0';
  844. }
  845. },
  846. {
  847. headerName: "3개월간 총 결제금액", field: "realOrdAmt", width: 150, cellClass: 'text-center',
  848. cellRenderer: function (params) {
  849. return !gagajf.isNull(params.value) ? params.value.addComma() : '0';
  850. }
  851. }
  852. ];
  853. //주소정보 그리드
  854. const columnAddrDefs = [
  855. {
  856. headerName: "배송지명", field: "delvAddrNm", width: 100, cellClass: 'text-center',
  857. cellRenderer: function (params) {
  858. return '<a href="javascript:void(0);">' + params.value + '</a>';
  859. }
  860. },
  861. {headerName: "수령자", field: "recipNm", width: 100, cellClass: 'text-center'},
  862. {headerName: "전화번호", field: "recipTelno", width: 130, cellClass: 'text-center'},
  863. {headerName: "휴대전화번호", field: "recipPhnno", width: 130, cellClass: 'text-center'},
  864. {headerName: "우편번호", field: "recipZipcode", width: 100, cellClass: 'text-center'},
  865. {headerName: "기본주소", field: "recipBaseAddr", width: 300, cellClass: 'text-left'},
  866. {headerName: "상세주소", field: "recipDtlAddr", width: 150, cellClass: 'text-left'},
  867. {headerName: "총알배송", field: "shotDelvUseYn", width: 90, cellClass: 'text-center'},
  868. {
  869. headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center',
  870. cellRenderer: function (params) {
  871. return gagaAgGrid.toDateTimeFormat(params.value);
  872. }
  873. },
  874. {headerName: "수정자", field: "regNm", width: 100, cellClass: 'text-center'},
  875. {
  876. headerName: "수정일시", field: "updDt", width: 150, cellClass: 'text-center',
  877. cellRenderer: function (params) {
  878. return gagaAgGrid.toDateTimeFormat(params.value);
  879. }
  880. },
  881. {headerName: "기본배송지", field: "defaultYn", width: 90, cellClass: 'text-center'}
  882. ];
  883. //회원접촉이력 그리드
  884. const columnContactDefs = [
  885. {
  886. headerName: "접촉유형", field: "contactType", width: 180, cellClass: 'text-center',
  887. valueFormatter: function (params) {
  888. return gagaAgGrid.lookupValue(contactTypeList, params.value);
  889. }
  890. },
  891. {
  892. headerName: "접촉방법", field: "contactMethod", width: 120, cellClass: 'text-center',
  893. valueFormatter: function (params) {
  894. return gagaAgGrid.lookupValue(contactMethodList, params.value);
  895. }
  896. },
  897. {headerName: "내용", field: "contactContents", width: 1000, cellClass: 'text-center'},
  898. {headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
  899. {
  900. headerName: "등록일", field: "regDt", width: 150, cellClass: 'text-center',
  901. cellRenderer: function (params) {
  902. return gagaAgGrid.toDateTimeFormat(params.value);
  903. }
  904. }
  905. ];
  906. let gridOrderOptions = gagaAgGrid.getGridOptions(columnOrderDefs); //구매내역 그리드
  907. let gridCounselOptions = gagaAgGrid.getGridOptions(columnCounselDefs); //1:1문의내역 그리드
  908. let gridGoodsQnaOptions = gagaAgGrid.getGridOptions(columnGoodsQnaDefs);//상품문의내역 그리드
  909. let gridCouponOptions = gagaAgGrid.getGridOptions(columnCouponDefs); //쿠폰내역 그리드
  910. let gridPointOptions = gagaAgGrid.getGridOptions(columnPointDefs); //포인트내역 그리드
  911. let gridGiftCardOptions = gagaAgGrid.getGridOptions(columnGiftCardDefs);//상품권내역 그리드
  912. let gridReviewOptions = gagaAgGrid.getGridOptions(columnReviewDefs); //상품평 그리드
  913. let gridGradeOptions = gagaAgGrid.getGridOptions(columnGradeDefs); //등급변경 그리드
  914. let gridAddrOptions = gagaAgGrid.getGridOptions(columnAddrDefs); //주소정보 그리드
  915. let gridContactOptions = gagaAgGrid.getGridOptions(columnContactDefs); //회원접촉이력 그리드
  916. gridOrderOptions.suppressRowClickSelection = true;
  917. gridCounselOptions.suppressRowClickSelection = true;
  918. gridGoodsQnaOptions.suppressRowClickSelection = true;
  919. gridCouponOptions.suppressRowClickSelection = true;
  920. gridPointOptions.suppressRowClickSelection = true;
  921. gridGiftCardOptions.suppressRowClickSelection = true;
  922. gridReviewOptions.suppressRowClickSelection = true;
  923. gridGradeOptions.suppressRowClickSelection = true;
  924. gridAddrOptions.suppressRowClickSelection = true;
  925. gridContactOptions.suppressRowClickSelection = true;
  926. // 기본정보 - 비밀번호 초기화 버튼
  927. $('#btnResetPassword').on('click', function () {
  928. mcxDialog.confirm("초기화 하시겠습니까?", {
  929. cancelBtnText: "취소",
  930. sureBtnText: "확인",
  931. sureBtnClick: function () {
  932. let orgEamil = $('#custInfoForm input[name=orgEmail]').val();
  933. $('#custInfoForm input[name=email]').val(orgEamil);
  934. let jsonData = JSON.stringify($('#custInfoForm').serializeObject());
  935. gagajf.ajaxJsonSubmit('/customer/password/reset', jsonData, fnSearchCustInfo);
  936. }
  937. });
  938. });
  939. // 기본정보 - LMS발송 버튼
  940. $('#btnCustSendLms').on('click', function () {
  941. if (!fnCheckValidationPhnno('#custInfoForm')) {
  942. return false;
  943. }
  944. let param = {};
  945. param.elementCellPhnno = '#custInfoForm input[name=cellPhnno]';
  946. param.elementCustNo = '#custInfoForm input[name=custNo]';
  947. param.elementMaskingCellPhnno = '#custInfoForm input[name=maskingCellPhnno]';
  948. cfnOpenLmsPopup(param);
  949. });
  950. // 기본정보 - 번호변경
  951. $('#btnCustCrtfd').on('click', function () {
  952. if (!fnCheckValidationPhnno('#custInfoForm')) {
  953. return false;
  954. }
  955. let elementCellPhnno = '#custInfoForm input[name=cellPhnno]';
  956. let elementCustNo = '#custInfoForm input[name=custNo]';
  957. const actionUrl = '/customer/cellphone/change/popup/form?elementCellPhnno=' + encodeURIComponent(elementCellPhnno)
  958. + '&elementCustNo=' + encodeURIComponent(elementCustNo);
  959. cfnOpenModalPopup(actionUrl, 'popupCellphoneForm');
  960. });
  961. // 기본정보 - 이메일발송 버튼
  962. $('#btnCustSendEmail').on('click', function () {
  963. let param = {};
  964. param.elementEmail = '#custInfoForm input[name=orgEmail]';
  965. param.elementCustNo ='#custInfoForm input[name=custNo]';
  966. param.elementMaskingEmail = '#custInfoForm input[name=maskingEmail]';
  967. cfnOpenEmailPopup(param);
  968. });
  969. // 기본정보 - 이메일 도메인 선택 이벤트
  970. $('#emailDomainList').on('change', function () {
  971. let domain = $(this).val();
  972. let $emailDomain = $('#emailDomain');
  973. if (domain === '99') { //기타(직접입력)
  974. $emailDomain.val('');
  975. } else if (domain !== '99' && !gagajf.isNull(domain)) {
  976. $emailDomain.val(domain);
  977. }
  978. });
  979. // 기본정보 - 탈퇴버튼
  980. $('#btnCustSecede').on('click', function () {
  981. let custNo = $('#custInfoForm input[name=custNo]').val();
  982. if (gagajf.isNull(custNo)) {
  983. mcxDialog.alert("탈퇴시킬 회원번호가 없습니다.");
  984. return;
  985. }
  986. let elementCustNo ='#custInfoForm input[name=custNo]';
  987. const actionUrl = '/customer/secede/popup/form?elementCustNo='+ encodeURIComponent(elementCustNo)
  988. cfnOpenModalPopup(actionUrl, 'popupCustSecedeForm');
  989. });
  990. // 기본정보 - 저장버튼
  991. $('#btnCustInfoSave').on('click', function () {
  992. //휴대폰번호
  993. if (!fnCheckValidationPhnno('#custInfoForm'))
  994. return false;
  995. //이메일
  996. if (!fnCheckValidationEmail('#custInfoForm'))
  997. return false;
  998. let customer = $('#custInfoForm').serializeObject();
  999. if (!gagajf.isNull(customer.managedRsn) && gagajf.isNull(customer.managedDtlRsn)) {
  1000. mcxDialog.alert("관리대상 지정 사유를 입력해주세요");
  1001. return;
  1002. }
  1003. // 마케팅 수신여부가 기존하고 바꼈는지 확인
  1004. // 데이터 변경 없으면 공배처리
  1005. if (customer.emailAgreeYn === orgData.emailAgreeYn) {
  1006. delete customer.emailAgreeYn;
  1007. }
  1008. // 데이터 변경 없으면 공배처리
  1009. if (customer.smsAgreeYn === orgData.smsAgreeYn) {
  1010. delete customer.smsAgreeYn;
  1011. }
  1012. customer.birthYmd = customer.birthYmd.replaceAll('-', '');
  1013. let jsonData = JSON.stringify(customer);
  1014. //console.log(jsonData);
  1015. mcxDialog.confirm("기본정보를 수정 하시겠습니까?", {
  1016. cancelBtnText: "취소",
  1017. sureBtnText: "확인",
  1018. sureBtnClick: function () {
  1019. gagajf.ajaxJsonSubmit('/customer/info/save', jsonData , function () {
  1020. uifnPopupClose('customerDetailForm');
  1021. $('#btnSearch').trigger('click');
  1022. });
  1023. }
  1024. });
  1025. });
  1026. // 배송지정보 - 신규버튼
  1027. $('#btnCustAddrNew').on('click', function () {
  1028. $('#custAddrForm')[0].reset();
  1029. $('#custAddrForm input[name=custDelvAddrSq]').val('');
  1030. $('#custAddrForm input[name=recipPhnno]').val('');
  1031. $('#custAddrForm input[name=recipTelno]').val('');
  1032. fnDisplayDeliveryCheckBox('N', 'N');
  1033. });
  1034. // 배송지정보 - 저장버튼
  1035. $('#btnCustAddrSave').on('click', function () {
  1036. if (!gagajf.validation('#custAddrForm'))
  1037. return false;
  1038. // 전화번호
  1039. let telFirstNo = $('#custAddrForm select[name=telFirstNo]').val();
  1040. let telMiddleNo = $('#custAddrForm input[name=telMiddleNo]').val();
  1041. let telLastNo = $('#custAddrForm input[name=telLastNo]').val();
  1042. if (!gagajf.isNull(telFirstNo) && !gagajf.isNull(telMiddleNo) && !gagajf.isNull(telLastNo)) {
  1043. $('#custAddrForm input[name=recipTelno]').val(telFirstNo + '-' + telMiddleNo + '-' + telLastNo);
  1044. }
  1045. // 핸드폰번호 필수값 validation 함수에서 null 체크
  1046. let recipFirstNo = $('#custAddrForm select[name=recipFirstNo]').val();
  1047. let recipMiddleNo = $('#custAddrForm input[name=recipMiddleNo]').val();
  1048. let recipLastNo = $('#custAddrForm input[name=recipLastNo]').val();
  1049. $('#custAddrForm input[name=recipPhnno]').val(recipFirstNo + '-' + recipMiddleNo + '-' + recipLastNo);
  1050. mcxDialog.confirm("저장하시겠습니까?", {
  1051. cancelBtnText: "취소",
  1052. sureBtnText: "확인",
  1053. sureBtnClick: function () {
  1054. gagajf.removeCommaAtNumberFormattedInput('#custAddrForm');
  1055. let jsonData = JSON.stringify($('#custAddrForm').serializeObject());
  1056. gagajf.ajaxJsonSubmit('/customer/delivery/addr/save', jsonData, fnCustSearchDelivery);
  1057. }
  1058. });
  1059. });
  1060. // 쿠폰삭제 버튼
  1061. $('#btnCustCouponDelete').on('click', function () {
  1062. let removedData = gagaAgGrid.removeRowData(gridCouponOptions);
  1063. if (removedData.length < 1) {
  1064. mcxDialog.alert("선택된 데이터가 없습니다.");
  1065. return;
  1066. }
  1067. mcxDialog.confirm("삭제 하시겠습니까?", {
  1068. cancelBtnText: "취소",
  1069. sureBtnText: "확인",
  1070. sureBtnClick: function () {
  1071. let updatedData = [];
  1072. $.each(removedData, function (idx, item) {
  1073. let param = {};
  1074. param.custCpnSq = item.custCpnSq;
  1075. param.custNo = item.custNo;
  1076. updatedData.push(param);
  1077. });
  1078. let jsonData = JSON.stringify(updatedData);
  1079. gagajf.ajaxJsonSubmit('/marketing/coupon/cust/delete', jsonData, fnSearchCoupon);
  1080. }
  1081. });
  1082. });
  1083. // 포인트부여 버튼
  1084. $('#btnCustPointCreate').on('click', function () {
  1085. let elementCustNo ='#custInfoForm input[name=custNo]';
  1086. const actionUrl = '/marketing/point/grant/popup/form?elementCustNo=' + encodeURIComponent(elementCustNo);
  1087. cfnOpenModalPopup(actionUrl, 'popupPointGrantForm');
  1088. });
  1089. // 쿠폰발급 버튼
  1090. $('#btnCustCouponCreate').on('click', function () {
  1091. let elementCustNo ='#custInfoForm input[name=custNo]';
  1092. const actionUrl = '/marketing/coupon/issue/popup/form?elementCustNo=' + encodeURIComponent(elementCustNo);
  1093. cfnOpenModalPopup(actionUrl, 'popupCouponIssue');
  1094. });
  1095. // 회원접촉이력 저장
  1096. $('#btnSaveContact').on('click', function () {
  1097. if (!gagajf.validation('#custContactHstForm')) {
  1098. return;
  1099. }
  1100. mcxDialog.confirm("저장하시겠습니까?", {
  1101. cancelBtnText: "취소",
  1102. sureBtnText: "확인",
  1103. sureBtnClick: function () {
  1104. var jsonData = JSON.stringify($('#custContactHstForm').serializeObject());
  1105. gagajf.ajaxJsonSubmit('/customer/contact/create', jsonData, fnSearchContact);
  1106. }
  1107. });
  1108. });
  1109. // 주문내역 셀 클릭 이벤트
  1110. gridOrderOptions.onCellClicked = function (event) {
  1111. if (event.colDef.field === 'goodsCd') {
  1112. let goodsCd = event.data.goodsCd;
  1113. cfnOpenGoodsDetailPopup('U', goodsCd);
  1114. }
  1115. if (event.colDef.field === 'ordNo') {
  1116. let ordNo = event.data.ordNo;
  1117. cfnOpenOrderDetailPopup(ordNo);
  1118. }
  1119. };
  1120. // 상품평내역 셀 클릭 이벤트
  1121. gridReviewOptions.onCellClicked = function (event) {
  1122. if (event.colDef.field === 'reviewContent') {
  1123. let reviewSq = event.data.reviewSq;
  1124. cfnOpenReviewDetailPopup(reviewSq);
  1125. }
  1126. };
  1127. // 1:1문의 내역 셀 클릭 이벤트
  1128. gridCounselOptions.onCellClicked = function (event) {
  1129. if (event.colDef.field === 'questTitle') {
  1130. let counselSq = event.data.counselSq;
  1131. cfnOpenOneToOneQnaDetailPopup(counselSq);
  1132. }
  1133. };
  1134. // 상품문의 내역 셀 클릭 이벤트
  1135. gridGoodsQnaOptions.onCellClicked = function (event) {
  1136. if (event.colDef.field === 'questTitle') {
  1137. let counselSq = event.data.counselSq;
  1138. cfnOpenGoodsQnaDetailPopup(counselSq);
  1139. }
  1140. };
  1141. // 주소지 셀 클릭 이벤트
  1142. gridAddrOptions.onCellClicked = function (event) {
  1143. if (event.colDef.field !== 'delvAddrNm')
  1144. return;
  1145. if (!gagajf.isNull(event.data)) {
  1146. $('#custAddrForm input[name=custDelvAddrSq]').val(event.data.custDelvAddrSq);
  1147. $('#custAddrForm input[name=delvAddrNm]').val(event.data.delvAddrNm);
  1148. $('#custAddrForm input[name=recipNm]').val(event.data.recipNm);
  1149. if (!gagajf.isNull(event.data.recipPhnno)) {
  1150. let phnNoSplit = event.data.recipPhnno.split("-");
  1151. $('#custAddrForm select[name=recipFirstNo]').val(phnNoSplit[0]);
  1152. $('#custAddrForm input[name=recipMiddleNo]').val(phnNoSplit[1]);
  1153. $('#custAddrForm input[name=recipLastNo]').val(phnNoSplit[2]);
  1154. }
  1155. if (!gagajf.isNull(event.data.recipTelno)) {
  1156. let telNoSplit = event.data.recipTelno.split("-");
  1157. $('#custAddrForm select[name=telFirstNo]').val(telNoSplit[0]);
  1158. $('#custAddrForm input[name=telMiddleNo]').val(telNoSplit[1]);
  1159. $('#custAddrForm input[name=telLastNo]').val(telNoSplit[2]);
  1160. }
  1161. $('#custAddrForm input[name=recipZipcode]').val(event.data.recipZipcode);
  1162. $('#custAddrForm input[name=recipBaseAddr]').val(event.data.recipBaseAddr);
  1163. $('#custAddrForm input[name=recipDtlAddr]').val(event.data.recipDtlAddr);
  1164. fnDisplayDeliveryCheckBox(event.data.defaultYn, event.data.delYn);
  1165. }
  1166. fnUnEscapeHtml(); //XSS변환
  1167. };
  1168. // 회원정보 조회
  1169. var fnSearchCustInfo = function () {
  1170. $.get('/customer/info/' + custNo
  1171. , function (data) {
  1172. if (!gagajf.isNull(data)) {
  1173. $('#spanCustNm').text(data.maskingCustNm);
  1174. $('#spanCustId').text(data.maskingCustId);
  1175. $('#siteNm').text(gagaAgGrid.lookupValue(siteList, data.siteCd));
  1176. $('#custGrade').val(data.custGrade);
  1177. $('#custGb').val(data.custGb);
  1178. $('#managedRsn').val(data.managedRsn);
  1179. $('#managedDtlRsn').val(data.managedDtlRsn);
  1180. $('#managedDt').text(gagaAgGrid.toDateTimeFormat(data.managedDt));
  1181. $('#joinDt').text(gagaAgGrid.toDateTimeFormat(data.joinDt));
  1182. let loginLdt = fnGetloginLdt(data.loginLdt);
  1183. $('#loginLdt').text(loginLdt);
  1184. let foreignerYn = data.foreignerYn === 'Y' ? '외국인' : '내국인';
  1185. $('#foreignerYn').text(foreignerYn);
  1186. fnGetSecedeRsnYn(data.custStat, data.secedeRsn); // 탈퇴여부
  1187. let snsType = fnGetSnsType(data.snsType);
  1188. $('#snsType').text(snsType);
  1189. $('#homeZipcode').val(data.homeZipcode);
  1190. $('#homeBaseAddr').val(data.homeBaseAddr);
  1191. $('#homeDtlAddr').val(data.homeDtlAddr);
  1192. $('#sexGb').text(gagaAgGrid.lookupValue(genderGbList, data.sexGb));
  1193. $('#birthYmd').val(gagaAgGrid.toDateFormat(data.birthYmd));
  1194. fnDisplayEmailAgree(data.emailAgreeYn);
  1195. fnDisplaySmsAgree(data.smsAgreeYn);
  1196. fnDisplayAppAgree(data.appAgreeYn);
  1197. fnDisplayMarketingAgree(data.mkAgreeYn);
  1198. fnDisplayEmail(data.email, data.maskingEmail);
  1199. fnDisplayCellPhnno(data.cellPhnno, data.maskingCellPhnno);
  1200. fnDisplayManaged(data.managedRsn);
  1201. orgData = data; // 기존 데이터
  1202. $('input[name=homeDtlAddr]').val($('input[name=homeDtlAddr]').val().replaceXSS());
  1203. console.log($('input[name=recipDtlAddr]').val($('input[name=recipDtlAddr]').val()));
  1204. // 고객계좌정보 조회
  1205. fnGetCustAccountInfo();
  1206. }
  1207. });
  1208. };
  1209. // 고객계좌정보 조회
  1210. var accountCertify = false;
  1211. var fnGetCustAccountInfo = function() {
  1212. accountCertify = false;
  1213. $.get('/customer/account/info/' + custNo, function(result) {
  1214. if (!gagajf.isNull(result)) {
  1215. let refundAccount = result.bankNm + ' / ' + result.accountNo + ' / ' + result.accountNm
  1216. + ' (' + result.regNm + ', ' + result.regDt + ')';
  1217. $('#refundAccount').text(refundAccount);
  1218. $('#divRefundAccountTxt').show();
  1219. $('#divRefundAccountInput').hide();
  1220. } else {
  1221. $('#custInfoForm select[name=bankCd]').val('');
  1222. $('#custInfoForm input[name=accountNo]').val('');
  1223. $('#custInfoForm input[name=accountNm]').val('');
  1224. $('#custInfoForm select[name=bankCd]').attr('disabled', false);
  1225. $('#custInfoForm input[name=accountNo]').attr('readonly', false);
  1226. $('#custInfoForm input[name=accountNm]').attr('readonly', false);
  1227. $('#divRefundAccountTxt').hide();
  1228. $('#divRefundAccountInput').show();
  1229. }
  1230. });
  1231. }
  1232. // 등록계좌삭제
  1233. $('#btnDeleteRefundAccount').on('click', function () {
  1234. mcxDialog.confirm("등록한 계좌를 삭제하시겠습니까?", {
  1235. cancelBtnText: "취소",
  1236. sureBtnText: "확인",
  1237. sureBtnClick: function() {
  1238. gagajf.ajaxJsonSubmit('/customer/account/delete/' + custNo, null, function() {
  1239. // 고객계좌정보 조회
  1240. fnGetCustAccountInfo();
  1241. });
  1242. }
  1243. });
  1244. });
  1245. // 은행계좌 유효성체크
  1246. var fnIsRefundAccountValidation = function () {
  1247. let bankCd = $('#custInfoForm select[name=bankCd]').val();
  1248. let accountNo = $('#custInfoForm input[name=accountNo]').val();
  1249. let accountNm = $('#custInfoForm input[name=accountNm]').val();
  1250. if (gagajf.isNull(bankCd)) {
  1251. mcxDialog.alertC('은행을 선택해 주세요.',{
  1252. sureBtnText: "확인",
  1253. sureBtnClick: function() {
  1254. $('#custInfoForm select[name=bankCd]').focus();
  1255. }
  1256. });
  1257. return false;
  1258. }
  1259. if (gagajf.isNull(accountNo)) {
  1260. mcxDialog.alertC('계좌번호를 입력해 주세요.',{
  1261. sureBtnText: "확인",
  1262. sureBtnClick: function() {
  1263. $('#custInfoForm input[name=accountNo]').focus();
  1264. }
  1265. });
  1266. return false;
  1267. }
  1268. if (gagajf.isNull(accountNm)) {
  1269. mcxDialog.alertC('예금주를 입력해 주세요.',{
  1270. sureBtnText: "확인",
  1271. sureBtnClick: function() {
  1272. $('#custInfoForm input[name=accountNm]').focus();
  1273. }
  1274. });
  1275. return false;
  1276. }
  1277. return true;
  1278. }
  1279. // 계좌인증
  1280. $('#btnCertifyRefundAccount').on('click', function () {
  1281. if (!fnIsRefundAccountValidation()) {
  1282. return;
  1283. }
  1284. let custInfo = {};
  1285. custInfo.custNo = custNo;
  1286. custInfo.bankCd = $('#custInfoForm select[name=bankCd]').val();
  1287. custInfo.accountNo = $('#custInfoForm input[name=accountNo]').val();
  1288. custInfo.accountNm = $('#custInfoForm input[name=accountNm]').val();
  1289. let jsonData = JSON.stringify(custInfo);
  1290. gagajf.ajaxJsonSubmit('/customer/account/check', jsonData, function(result) {
  1291. let msg = '계좌가 인증되었습니다.';
  1292. if (result.isValid) { // 유효하면
  1293. $('#custInfoForm select[name=bankCd]').attr('disabled', true);
  1294. $('#custInfoForm input[name=accountNo]').attr('readonly', true);
  1295. $('#custInfoForm input[name=accountNm]').attr('readonly', true);
  1296. accountCertify = true;
  1297. } else {
  1298. accountCertify = false;
  1299. msg = '인증에 실패했습니다. 은행/계좌번호/예금주를 다시 확인해 주세요.';
  1300. }
  1301. mcxDialog.alert(msg);
  1302. });
  1303. });
  1304. // 계좌등록
  1305. $('#btnRegisterRefundAccount').on('click', function () {
  1306. if (!fnIsRefundAccountValidation()) {
  1307. return;
  1308. }
  1309. if (!accountCertify) {
  1310. mcxDialog.alert("계좌인증 후 등록해 주세요.");
  1311. return;
  1312. }
  1313. mcxDialog.confirm("계좌를 등록하시겠습니까?", {
  1314. cancelBtnText: "취소",
  1315. sureBtnText: "확인",
  1316. sureBtnClick: function() {
  1317. let custInfo = {};
  1318. custInfo.custNo = custNo;
  1319. custInfo.bankCd = $('#custInfoForm select[name=bankCd]').val();
  1320. custInfo.accountNm = $('#custInfoForm input[name=accountNm]').val();
  1321. custInfo.accountNo = $('#custInfoForm input[name=accountNo]').val();
  1322. let jsonData = JSON.stringify(custInfo);
  1323. gagajf.ajaxJsonSubmit('/customer/account/create', jsonData, function() {
  1324. // 고객계좌정보 조회
  1325. fnGetCustAccountInfo();
  1326. });
  1327. }
  1328. });
  1329. });
  1330. // CI초기화
  1331. $('#btnInitializeCI').on('click', function () {
  1332. mcxDialog.confirm("휴대전화번호와 CI 값이 삭제됩니다. 계속하시겠습니까?", {
  1333. cancelBtnText: "취소",
  1334. sureBtnText: "확인",
  1335. sureBtnClick: function() {
  1336. let custInfo = {};
  1337. custInfo.custNo = custNo;
  1338. let jsonData = JSON.stringify(custInfo);
  1339. gagajf.ajaxJsonSubmit('/customer/cellphnno/delete', jsonData, function() {
  1340. $('#custInfoForm input[name=cellPhnno]').val('');
  1341. $('#custInfoForm input[name=maskingCellPhnno]').val('');
  1342. });
  1343. }
  1344. });
  1345. });
  1346. $('#custOrderListFrom select[name=pageSize]').on('click', function () {
  1347. fnSearchOrder();
  1348. });
  1349. // 구매내역 조회
  1350. var fnSearchOrder = function () {
  1351. gagaPaging.init('custOrderListFrom', fnCustOrderListCallBack, 'custOrderListPagination', $('#custOrderListFrom select[name=pageSize]').val());
  1352. gagaPaging.load($('#custOrderListFrom input[name=pageNo]').val());
  1353. };
  1354. var fnCustOrderListCallBack = function (result) {
  1355. $('#gridOrderRowTotalCount').html(result.pageing.pageable.totalCount.addComma());
  1356. $('#custOrderListFrom input[name=pageNo]').val(result.pageing.pageable.pageNo.addComma());
  1357. $('#ordPgNo').html(result.pageing.pageable.pageNo.addComma());
  1358. $('#ordEndPgNo').html(result.pageing.pageable.totalPage.addComma());
  1359. gridOrderOptions.api.setRowData(result.custOrderList);
  1360. gagaPaging.createPagination(result.pageing.pageable);
  1361. }
  1362. // 배송지 조회
  1363. var fnCustSearchDelivery = function () {
  1364. const actionUrl = "/customer/delivery/list/" + custNo;
  1365. gagaAgGrid.fetch(actionUrl, gridAddrOptions,null,fnChangeGrid);
  1366. $('#btnCustAddrNew').trigger('click');
  1367. };
  1368. // 쿠폰내역 조회
  1369. var fnSearchCoupon = function () {
  1370. const actionUrl = "/customer/coupon/list/" + custNo;
  1371. gagaAgGrid.fetch(actionUrl, gridCouponOptions);
  1372. };
  1373. // 포인트내역 조회
  1374. var fnSearchPoint = function () {
  1375. $.get('/customer/point/' + custNo
  1376. , function (data) {
  1377. if (!gagajf.isNull(data)) {
  1378. $('#custPointForm td[name=availPntAmt]').text(data.rmPntAmt.addComma() + ' P');
  1379. $('#custPointForm td[name=accumPntAmt]').text(data.gvPntAmt.addComma() + ' P');
  1380. $('#custPointForm td[name=usePntAmt]').text(data.usPntAmt.addComma() + ' P');
  1381. $('#custPointForm td[name=expirePntAmt]').text(data.expirePntAmt.addComma() + ' P');
  1382. $('#custPointForm td[name=expectedPntAmt]').text(data.expectedPntAmt.addComma() + ' P');
  1383. $('#custPointForm td[name=expectedExpirePntAmt]').text(data.expectedExpirePntAmt.addComma() + ' P');
  1384. }
  1385. });
  1386. const actionUrl = "/customer/point/list/" + custNo;
  1387. gagaAgGrid.fetch(actionUrl, gridPointOptions);
  1388. };
  1389. // 상품권 조회
  1390. var fnSearchGiftCard = function () {
  1391. const actionUrl = "/customer/giftcard/list/" + custNo;
  1392. gagaAgGrid.fetch(actionUrl, gridGiftCardOptions);
  1393. };
  1394. // 상품평내역 조회
  1395. var fnSearchReview = function () {
  1396. const actionUrl = "/customer/review/list/" + custNo;
  1397. gagaAgGrid.fetch(actionUrl, gridReviewOptions);
  1398. };
  1399. // 1:1문의 내역 조회
  1400. var fnSearchCounsel = function () {
  1401. const actionUrl = "/customer/counsel/list/" + custNo;
  1402. gagaAgGrid.fetch(actionUrl, gridCounselOptions);
  1403. };
  1404. // 상품문의 내역 조회
  1405. var fnSearchGoodsQna = function () {
  1406. const actionUrl = "/customer/goodsQna/list/" + custNo;
  1407. gagaAgGrid.fetch(actionUrl, gridGoodsQnaOptions);
  1408. };
  1409. // 회원접촉이력 조회
  1410. var fnSearchContact = function () {
  1411. $('#custContactHstForm')[0].reset();
  1412. const actionUrl = "/customer/contact/list/" + custNo;
  1413. gagaAgGrid.fetch(actionUrl, gridContactOptions,null,fnChangeGrid1);
  1414. };
  1415. // 회원등급변경이력 조회
  1416. var fnSearchChangeGrade = function () {
  1417. const actionUrl = "/customer/change/grade/list/" + custNo;
  1418. gagaAgGrid.fetch(actionUrl, gridGradeOptions);
  1419. };
  1420. /**
  1421. * DAUM을 이용한 우편번호 팝업 레이어
  1422. */
  1423. var fnOpenDaumAddr = function(id) {
  1424. let daumZip = new daum.Postcode({
  1425. oncomplete: function(data) {
  1426. // 우편번호와 주소 정보를 해당 필드에 넣는다.
  1427. if (id === 'custInfoForm') {
  1428. $('#homeZipcode').val(data.zonecode);
  1429. $('#homeBaseAddr').val(cfnGetDaumRoadAddr(data));
  1430. $('#homeDtlAddr').focus();
  1431. }
  1432. if (id === 'custAddrForm') {
  1433. $('#recipZipcode').val(data.zonecode);
  1434. $('#recipBaseAddr').val(cfnGetDaumRoadAddr(data));
  1435. $('#recipDtlAddr').focus();
  1436. }
  1437. cfnCloseDaumAddr();
  1438. },
  1439. width: '100%'
  1440. });
  1441. cfnOpenDaumAddr(daumZip);
  1442. }
  1443. // 휴대전화 유효성 체크 및 데이터 셋팅
  1444. var fnCheckValidationPhnno = function (formId) {
  1445. let result = true;
  1446. if (!gagajf.testRegexp($(formId + ' input[name=cellPhnno]'), /^(01(?:0|1|[6-9])-(?:\d{3}|\d{4})-\d{4})$/)) {
  1447. result = false;
  1448. }
  1449. return result;
  1450. };
  1451. // 이메일 체크 및 데이터 셋팅
  1452. var fnCheckValidationEmail = function (formId) {
  1453. let result = true;
  1454. let emailId = $(formId + ' input[name=emailId]').val();
  1455. let emailDomain = $(formId + ' input[name=emailDomain]').val();
  1456. $(formId + ' input[name=email]').val(emailId + '@' + emailDomain);
  1457. if (orgData.maskingEmail === $(formId + ' input[name=email]').val()) {
  1458. $(formId + ' input[name=emailModifyYn]').val('N');
  1459. return true;
  1460. } else {
  1461. if (!gagajf.testRegexp($(formId + ' input[name=email]'), /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/)) {
  1462. result = false;
  1463. }
  1464. // 수정되었으면 Y로 변경
  1465. if (result) {
  1466. $(formId + ' input[name=emailModifyYn]').val('Y');
  1467. }
  1468. }
  1469. return result;
  1470. };
  1471. // 관리대상
  1472. var fnDisplayManaged = function (managedRsn) {
  1473. const $managedRsnNm = $('#managedRsnNm');
  1474. const $managedRsnDp = $('#managedRsnDp');
  1475. $managedRsnNm.text('');
  1476. $managedRsnNm.hide();
  1477. $managedRsnDp.text('');
  1478. $managedRsnDp.hide();
  1479. if (!gagajf.isNull(managedRsn)) {
  1480. let html = '<i class="fa fa-info-circle"></i>';
  1481. $managedRsnNm.html(html);
  1482. $managedRsnNm.show();
  1483. $managedRsnDp.html(html);
  1484. $managedRsnDp.show();
  1485. }
  1486. };
  1487. // 탈퇴여부
  1488. var fnGetSecedeRsnYn = function (custStat, secedeRsn) {
  1489. const activeCustomer = 'G104_10';
  1490. let secedeRsnYn = gagajf.isNull(secedeRsn) ? '아니요' : '예';
  1491. $('#secedeRsnYn').text(secedeRsnYn);
  1492. if (custStat === activeCustomer) {
  1493. $('#btnCustSecede').show();
  1494. }
  1495. }
  1496. // 휴대전화번호
  1497. var fnDisplayCellPhnno = function (cellPhnno, maskingCellPhnno) {
  1498. $('#custInfoForm input[name=cellPhnno]').val(cellPhnno);
  1499. $('#custInfoForm input[name=maskingCellPhnno]').val(maskingCellPhnno);
  1500. };
  1501. // 이메일
  1502. var fnDisplayEmail = function (email, maskingEmail) {
  1503. if (!gagajf.isNull(maskingEmail)) {
  1504. let emailSplit = maskingEmail.split("@");
  1505. $('#emailId').val(emailSplit[0]);
  1506. $('#emailDomain').val(emailSplit[1]);
  1507. $('#custInfoForm input[name=maskingEmail]').val(maskingEmail);
  1508. }
  1509. $('#custInfoForm input[name=orgEmail]').val(email);
  1510. };
  1511. // 이메일 수신동의
  1512. var fnDisplayEmailAgree = function (emailAgreeYn) {
  1513. let emailEq = emailAgreeYn === 'Y' ? 0 : 1;
  1514. const $emailAgreeYn = $('#custInfoForm input:radio[name=emailAgreeYn]');
  1515. $emailAgreeYn.eq(emailEq).prop('checked', true);
  1516. $emailAgreeYn.eq(emailEq).parent().addClass('checked');
  1517. };
  1518. // SMS 수신동의
  1519. var fnDisplaySmsAgree = function (smsAgreeYn) {
  1520. let smsEq = smsAgreeYn === 'Y' ? 0 : 1;
  1521. const $smsAgreeYn = $('#custInfoForm input:radio[name=smsAgreeYn]');
  1522. $smsAgreeYn.eq(smsEq).prop('checked', true);
  1523. $smsAgreeYn.eq(smsEq).parent().addClass('checked');
  1524. };
  1525. // APP 수신동의
  1526. var fnDisplayAppAgree = function (appAgreeYn) {
  1527. let appEq = appAgreeYn === 'Y' ? 0 :1 ;
  1528. const $appAgreeYn = $('#custInfoForm input:radio[name=appAgreeYn]');
  1529. $appAgreeYn.eq(appEq).prop('checked', true);
  1530. $appAgreeYn.eq(appEq).parent().addClass('checked');
  1531. $appAgreeYn.attr('disabled', true);
  1532. };
  1533. // 마케팅 수신동의
  1534. var fnDisplayMarketingAgree = function (mkAgreeYn) {
  1535. let mkEq = mkAgreeYn === 'Y' ? 0 :1 ;
  1536. const $mkAgreeYn = $('#custInfoForm input:radio[name=mkAgreeYn]');
  1537. $mkAgreeYn.eq(mkEq).prop('checked', true);
  1538. $mkAgreeYn.eq(mkEq).parent().addClass('checked');
  1539. $mkAgreeYn.attr('disabled', true);
  1540. };
  1541. // 최종로그인 일시
  1542. var fnGetloginLdt = function (loginLdt) {
  1543. let result = '로그인 이력이 없습니다.';
  1544. if (!gagajf.isNull(loginLdt)) {
  1545. result = gagaAgGrid.toDateTimeFormat(loginLdt);
  1546. }
  1547. return result;
  1548. };
  1549. // SNS가입유형
  1550. var fnGetSnsType = function (snsType) {
  1551. let snsText = '';
  1552. if (snsType === 'NV') {
  1553. snsText = '네이버'
  1554. }
  1555. if (snsType === 'KK') {
  1556. snsType = '카카오';
  1557. }
  1558. if (snsType === 'YS') {
  1559. snsText = 'YES24';
  1560. }
  1561. return snsText;
  1562. };
  1563. // 생년월일 달력 설정
  1564. var fnDisplayBirthYmd = function () {
  1565. const $birthYmd = $('#birthYmd');
  1566. let currentYear = new Date().format('YYYY');
  1567. $birthYmd.datepicker("destroy");
  1568. $birthYmd.datepicker({
  1569. changeMonth: true,
  1570. changeYear: true,
  1571. yearRange: (currentYear - 100) + ' : ' + (currentYear - 14),
  1572. defaultDate: $birthYmd.val()
  1573. });
  1574. };
  1575. // 배송지 기본,삭제 체크박스 설정
  1576. var fnDisplayDeliveryCheckBox = function (defaultYn, delYn) {
  1577. let $defaultYn = $('#custAddrForm input:checkbox[name=defaultYn]');
  1578. let $delYn = $('#custAddrForm input:checkbox[name=delYn]');
  1579. let defaultBoolean;
  1580. let delBoolean;
  1581. if (defaultYn === 'Y') {
  1582. defaultBoolean = true;
  1583. $defaultYn.parent().addClass('checked');
  1584. } else {
  1585. defaultBoolean = false;
  1586. $defaultYn.parent().removeClass('checked');
  1587. }
  1588. if (delYn === 'Y') {
  1589. delBoolean = true;
  1590. $delYn.parent().addClass('checked');
  1591. } else {
  1592. delBoolean = false;
  1593. $delYn.parent().removeClass('checked');
  1594. }
  1595. $defaultYn.prop('checked', defaultBoolean);
  1596. $delYn.prop('checked', delBoolean);
  1597. }
  1598. $('#btnLogin').on('click', function () {
  1599. let custId = $('#spanCustId').text();
  1600. const actionUrl = _frontUrl + '/customer/front/login?custId=' + custId;
  1601. let popupWidth = window.screen.width;
  1602. let popupHeight = window.screen.height;
  1603. window.open(actionUrl);
  1604. });
  1605. var fnUnEscapeHtml = function(){ //XSS 변환
  1606. $('input[name=delvAddrNm]').val($('input[name=delvAddrNm]').val().replaceXSS());
  1607. $('input[name=recipNm]').val($('input[name=recipNm]').val().replaceXSS());
  1608. $('input[name=recipDtlAddr]').val($('input[name=recipDtlAddr]').val().replaceXSS());
  1609. $('input[name=recipZipcode]').val($('input[name=recipZipcode]').val().replaceXSS());
  1610. $('input[name=recipBaseAddr]').val($('input[name=recipBaseAddr]').val().replaceXSS());
  1611. };
  1612. var fnChangeGrid = function(){ //XSS 그리드 내 변환
  1613. var data = gagaAgGrid.getAllRowData(gridAddrOptions);
  1614. let modifyList = [];
  1615. $.each(data, function(idx, item) {
  1616. let recipNm = item.recipDtlAddr;
  1617. let recipDtlAddr = item.recipDtlAddr;
  1618. let recipZipcode = item.recipZipcode;
  1619. let recipBaseAddr = item.recipBaseAddr;
  1620. item.recipNm = recipNm.replaceXSS();
  1621. item.recipDtlAddr = recipDtlAddr.replaceXSS();
  1622. item.recipZipcode = recipZipcode.replaceXSS();
  1623. item.recipBaseAddr = recipBaseAddr.replaceXSS();
  1624. modifyList.push(item);
  1625. });
  1626. gridAddrOptions.api.setRowData(modifyList);
  1627. };
  1628. var fnChangeGrid1 = function(){ //XSS 그리드 내 변환
  1629. var data = gagaAgGrid.getAllRowData(gridContactOptions);
  1630. let modifyList = [];
  1631. $.each(data, function(idx, item) {
  1632. let contactContents = item.contactContents;
  1633. item.contactContents = contactContents.replaceXSS();
  1634. modifyList.push(item);
  1635. });
  1636. gridContactOptions.api.setRowData(modifyList);
  1637. };
  1638. $(document).ready(function () {
  1639. fnDisplayBirthYmd(); //생년월일 달력 설정
  1640. fnSearchCustInfo(); //회원정보 조회
  1641. gagaAgGrid.createGrid('custOrderList', gridOrderOptions); // 주문내역
  1642. gagaAgGrid.createGrid('custAddrList', gridAddrOptions); // 주소정보 그리드
  1643. gagaAgGrid.createGrid('custCouponList', gridCouponOptions); // 쿠폰내역
  1644. gagaAgGrid.createGrid('custPointList', gridPointOptions); // 포인트내역 그리드
  1645. gagaAgGrid.createGrid('custGiftCardList', gridGiftCardOptions); // 상품권내역 그리드
  1646. gagaAgGrid.createGrid('custCounselList', gridCounselOptions); // 1:1문의 내역
  1647. gagaAgGrid.createGrid('custGoodsQnaList', gridGoodsQnaOptions); // 상품문의 내역
  1648. gagaAgGrid.createGrid('custReviewList', gridReviewOptions); // 상품평 그리드
  1649. gagaAgGrid.createGrid('custGradeList', gridGradeOptions); // 등급변경 그리드
  1650. gagaAgGrid.createGrid('custContactList', gridContactOptions); // 회원접촉이력 그리드
  1651. });
  1652. /*]]>*/
  1653. </script>
  1654. </html>